1. 程式人生 > >使用百度地圖SDK定位當前位置並顯示在地圖上

使用百度地圖SDK定位當前位置並顯示在地圖上

package com.shz.baidumap;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity
; import android.widget.TextView; import android.widget.Toast; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi
.map.BaiduMap; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { public LocationClient mLocationClient;
private TextView positionText; private MapView mMapView; private BaiduMap mBaiduMap; private boolean isFirstLocate = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /*例項化 定位客戶端*/ mLocationClient = new LocationClient(getApplicationContext()); /*註冊回撥方法,顯示定位結果資訊*/ mLocationClient.registerLocationListener(new MyLocationListener()); /*初始化SDK 為了顯示地圖*/ SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); mMapView = (MapView) findViewById(R.id.bmapView); /*獲取百度map控制元件*/ mBaiduMap = mMapView.getMap(); mBaiduMap.setMyLocationEnabled(true); positionText = findViewById(R.id.position_text_view); /*統一申請許可權*/ List<String>permissionList = new ArrayList<>(); if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest. permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION); } if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest. permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.READ_PHONE_STATE); } if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest. permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } if(!permissionList.isEmpty()){ String [] permissions= permissionList.toArray(new String[permissionList. size()]); /*使用ActivityCompat 統一申請許可權 */ ActivityCompat.requestPermissions(MainActivity.this,permissions,1); }else { /*開始定位*/ requestLocation(); } } private void requestLocation(){ initLocation(); /*開始定位*/ mLocationClient.start(); } /*設定5000ms更新一次座標位置資訊*/ private void initLocation(){ LocationClientOption option = new LocationClientOption(); option.setScanSpan(5000); // option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors); option.setIsNeedAddress(true); mLocationClient.setLocOption(option); } @Override /*重寫Activity 方法返回申請許可權結果*/ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch(requestCode){ case 1: if(grantResults.length > 0) { for (int result:grantResults) { if(result != PackageManager.PERMISSION_GRANTED){ Toast.makeText(this,"必須同意所有許可權才能使用本程式", Toast.LENGTH_SHORT).show(); finish(); return; } } requestLocation(); }else { Toast.makeText(this,"發生未知錯誤",Toast.LENGTH_SHORT).show(); finish(); } break; default: } } /*將當前位置顯示在地圖上*/ private void navigateTo(BDLocation location){ if(isFirstLocate){ // /*獲取經緯度*/ LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude()); MapStatusUpdate update = MapStatusUpdateFactory.newLatLng(latLng); mBaiduMap.animateMapStatus(update); update=MapStatusUpdateFactory.zoomTo(16f); mBaiduMap.animateMapStatus(update); isFirstLocate = false; } /*獲取當前位置 並顯示到地圖上*/ MyLocationData.Builder locationBuilder = new MyLocationData.Builder(); locationBuilder.latitude(location.getLatitude()); locationBuilder.longitude(location.getLongitude()); MyLocationData locationData = locationBuilder.build(); mBaiduMap.setMyLocationData(locationData); } public class MyLocationListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation bdLocation) { /*顯示當前位置地圖*/ if(bdLocation.getLocType() ==BDLocation.TypeGpsLocation ||bdLocation.getLocType() == BDLocation.TypeNetWorkException){ navigateTo(bdLocation); } StringBuilder currentPostion = new StringBuilder(); currentPostion.append("精度:").append(bdLocation.getLatitude()).append("\n"); currentPostion.append("緯度: ").append(bdLocation.getLongitude()).append("\n"); currentPostion.append("國家: ").append(bdLocation.getCountry()).append("\n"); currentPostion.append("省: ").append(bdLocation.getProvince()).append("\n"); currentPostion.append("市: ").append(bdLocation.getCity()).append("\n"); currentPostion.append("區: ").append(bdLocation.getDistrict()).append("\n"); currentPostion.append("街道: ").append(bdLocation.getStreet()).append("\n"); currentPostion.append("定位方式: "); if(bdLocation.getLocType() == BDLocation.TypeGpsLocation){ currentPostion.append("GPS"); }else { currentPostion.append("網路"); } positionText.setText(currentPostion); } } @Override protected void onResume() { super.onResume(); mMapView.onResume(); } @Override protected void onPause() { super.onPause(); mMapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); mLocationClient.stop(); mMapView.onDestroy(); mBaiduMap.setMyLocationEnabled(false); } }

為什麼只顯示網格不顯示地圖呢???

參考資料:郭霖《Android第一行程式碼》第二版 第11章基於百度地圖的開發