目標:實現定位到當前所在位置git
效果圖:ide
上代碼函數
public class MainActivity extends AppCompatActivity { private MapView mMapView = null; BaiduMap mBaiduMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //在使用SDK各組件以前初始化context信息,傳入ApplicationContext //注意該方法要再setContentView方法以前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); //獲取地圖控件引用 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); //移除baidu的logo mMapView.removeViewAt(1); mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder().zoom(20.0f).build())); mLocationClient = new LocationClient(getApplicationContext()); //聲明LocationClient類 mLocationClient.registerLocationListener(myListener); // 開啓定位圖層 mBaiduMap.setMyLocationEnabled(true); //註冊監聽函數 // 設置定位圖層的配置(定位模式,是否容許方向信息,用戶自定義定位圖標) BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory .fromResource(R.drawable.aa); MyLocationConfiguration config = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, mCurrentMarker); mBaiduMap.setMyLocationConfiguration(config); // getLocation(); getlatAndLng(); // mLocationClient.start(); } private void showMyLocate(MyLocationData location) { MyLocationData locData = new MyLocationData.Builder() .accuracy(location.accuracy) // 此處設置開發者獲取到的方向信息,順時針0-360 .direction(location.direction).latitude(location.latitude) .longitude(location.longitude).build(); // 設置定位數據 mBaiduMap.setMyLocationData(locData); // mBaiduMap.setMyLocationEnabled(false); } public LocationClient mLocationClient = null; private MyLocationListener myListener = new MyLocationListener(); private void getLocation() { LocationClientOption option = new LocationClientOption(); option.setIsNeedAddress(true); //可選,是否須要地址信息,默認爲不須要,即參數爲false //若是開發者須要得到當前點的地址信息,此處必須爲true mLocationClient.setLocOption(option); //mLocationClient爲第二步初始化過的LocationClient對象 //需將配置好的LocationClientOption對象,經過setLocOption方法傳遞給LocationClient對象使用 //更多LocationClientOption的配置,請參照類參考中LocationClientOption類的詳細說明 mLocationClient.start(); } private void getlatAndLng() { LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); //可選,設置定位模式,默認高精度 //LocationMode.Hight_Accuracy:高精度; //LocationMode. Battery_Saving:低功耗; //LocationMode. Device_Sensors:僅使用設備; option.setCoorType("bd09ll"); //可選,設置返回經緯度座標類型,默認gcj02 //gcj02:國測局座標; //bd09ll:百度經緯度座標; //bd09:百度墨卡託座標; //海外地區定位,無需設置座標類型,統一返回wgs84類型座標 option.setScanSpan(1000); //可選,設置發起定位請求的間隔,int類型,單位ms //若是設置爲0,則表明單次定位,即僅定位一次,默認爲0 //若是設置非0,需設置1000ms以上纔有效 option.setOpenGps(true); //可選,設置是否使用gps,默認false //使用高精度和僅用設備兩種定位模式的,參數必須設置爲true option.setLocationNotify(true); //可選,設置是否當GPS有效時按照1S/1次頻率輸出GPS結果,默認false option.setIgnoreKillProcess(false); //可選,定位SDK內部是一個service,並放到了獨立進程。 //設置是否在stop的時候殺死這個進程,默認(建議)不殺死,即setIgnoreKillProcess(true) option.SetIgnoreCacheException(false); //可選,設置是否收集Crash信息,默認收集,即參數爲false option.setWifiCacheTimeOut(5 * 60 * 1000); //可選,7.2版本新增能力 //若是設置了該接口,首次啓動定位時,會先判斷當前WiFi是否超出有效期,若超出有效期,會先從新掃描WiFi,而後定位 option.setEnableSimulateGps(false); //可選,設置是否須要過濾GPS仿真結果,默認須要,即參數爲false mLocationClient.setLocOption(option); //mLocationClient爲第二步初始化過的LocationClient對象 //需將配置好的LocationClientOption對象,經過setLocOption方法傳遞給LocationClient對象使用 //更多LocationClientOption的配置,請參照類參考中LocationClientOption類的詳細說明 mLocationClient.start(); } @Override protected void onDestroy() { super.onDestroy(); //在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 // 當不須要定位圖層時關閉定位圖層 mBaiduMap.setMyLocationEnabled(false); mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理 mMapView.onPause(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_map_normal: mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); break; case R.id.menu_map_satellite: mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); break; case R.id.menu_map_none: mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE); break; } return true; } class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(BDLocation bdLocation) { MyLocationData locData = new MyLocationData.Builder() .accuracy(bdLocation.getRadius()) // 此處設置開發者獲取到的方向信息,順時針0-360 .direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude()) .longitude(bdLocation.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); String addr = bdLocation.getAddrStr(); //獲取詳細地址信息 String country = bdLocation.getCountry(); //獲取國家 String province = bdLocation.getProvince(); //獲取省份 String city = bdLocation.getCity(); //獲取城市 String district = bdLocation.getDistrict(); //獲取區縣 String street = bdLocation.getStreet(); //獲取街道信息 showMyLocate(locData); } } }