http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/v5-0
0:首先先集成百度地图的定位到AndroidStudio 中,
添加service <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
添加相应的权限
key 就不用重复写了.
记住了,一定要导入SDK,SDK的下载地址为:http://lbsyun.baidu.com/sdk/download?selected=location
1:开始使用定位:
@Override protected void onCreate(Bundle savedInstanceState) { .... mLocationClient = new LocationClient(getApplicationContext()); mLocationClient.registerLocationListener(this); .... }
回调方法是:
public void onReceiveLocation(BDLocation bdLocation) {
}
然后在这个回调方法里面有一个参数时BDLocation,,可以通过这个BDLocation 来获取经纬度 和 定位的类型,获取当前的位置,然后,获取国家街道,市,区,街道,街道号getAddrStr()其实都是通过参数bdLocation
int locType = bdLocation.getLocType();
//可以通过BDLocation.TypeXxxxXxxx来判断类型代表的内容
double latitute =bdLocation.getLatitude();
double longtitute=bdLocation.getLongitude(
@Override public void onReceiveLocation(BDLocation bdLocation) { //TODO: 利用BDLoacation.getLocType()来判断成功和失败,以及定位类型 int locType = bdLocation.getLocType(); //可以通过BDLocation.TypeXxxxXxxx来判断类型代表的内容 switch (locType) { case BDLocation.TypeNetWorkLocation: case BDLocation.TypeCacheLocation: case BDLocation.TypeGpsLocation: double latitute = bdLocation.getLatitude(); double longtitute = bdLocation.getLongitude(); bdLocation.getCountry();//国家 bdLocation.getProvince();//省 bdLocation.getCity();//市 bdLocation.getDistrict();//区 bdLocation.getStreet();//街道 bdLocation.getStreetNumber();//街道号 bdLocation.getAddrStr(); Log.d("Location", "" + latitute + " " + longtitute); updateCurrentLocationMarker(bdLocation); break; default: //定位失败 break; } }
//--------------------------------------- //定位结果回调 private Marker currentLocationMarker; private void updateCurrentLocationMarker(BDLocation location){ LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); //更新当前位置的图标: if(currentLocationMarker==null) { MarkerOptions options = new MarkerOptions(); options.position(latLng); BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher); options.icon(icon); //map.addOverlay(options); currentLocationMarker=(Marker)map.addOverlay(options); }else{ currentLocationMarker.setPosition(latLng); } //动态的切换当前的地图位置以定位的坐标为中心点; //需要动态的更新地图状态, MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLng(latLng);//设置中心点 map.setMapStatus(mapStatusUpdate); }
2:
添加一个按钮来启动定位,然后启动之后会回调上面的方法:
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving);
option.setCoorType("bd09ll");//注意后面的是字母l,而不是1
option.setScanSpan(5000);
option.setIsNeedAddress(true);
option.setOpenGps(true);
//推荐使用的,但是没有意义,百度定位用于统计客户端信息的,可能以后会给开发者查看报表
option.setProdName("xueziqiang");
mLocationClient.setLocOption(option);
//获取定位地址(一次or循环)
mLocationClient.start();//start开始定位,如果setScanSpan()大于1000会重复定位,除非stop
//如果想单独一次,请求一次定位就行了
mLocationClient.requestLocation();
//默认的情况下,百度定位返回的坐标系百度地图使用的时候会有偏差。
//使用bd09ll 代表百度地图自身使用的经纬度latitue longtitue,我们就是使用这个bd09ll
//使用“gcj02” 代表“国家测绘局”使用的坐标系数据。
//使用“bd09”墨卡托投影
//如果使用百度定位,然后定位的信息显示在高德地图上,那么需要使用gcj02.
//-----------------
option.setCoorType("bd09ll");//注意后面的是字母l,而不是1
具体如下:
添加
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="btnCheckLocation" android:text="定位当前位置"/>
public void btnCheckLocation(View view) { //准备参数 LocationClientOption option = new LocationClientOption(); //设置定位的模式,最要在于定位的精度,高精度,低功耗,仅设备 // LocationClientOption.LocationMode.Hight_Accuracy; // LocationClientOption.LocationMode.Battery_Saving; // LocationClientOption.LocationMode.Device_Sensors; option.setLocationMode(LocationClientOption.LocationMode.Battery_Saving); //默认的情况下,百度定位返回的坐标系百度地图使用的时候会有偏差。 //使用bd09ll 代表百度地图自身使用的经纬度latitue longtitue,我们就是使用这个bd09ll //使用“gcj02” 代表“国家测绘局”使用的坐标系数据。 //使用“bd09”墨卡托投影 //如果使用百度定位,然后定位的信息显示在高德地图上,那么需要使用gcj02. //----------------- option.setCoorType("bd09ll");//注意后面的是字母l,而不是1 //设置定位的扫描间隔,如果小于1000,代表执行一次;对于只执行一次的而言,不设置更好 //如果大于1000,代表每间隔多少毫米,进行一次定位刷新, option.setScanSpan(5000); //设置是否返回当前的街道名称地址 option.setIsNeedAddress(true); //是否打开Gps option.setOpenGps(true); //推荐使用的,但是没有意义,百度定位用于统计客户端信息的,可能以后会给开发者查看报表 option.setProdName("xueziqiang"); //给LocationClient 来设置参数, mLocationClient.setLocOption(option); //获取定位地址(一次or循环) mLocationClient.start();//start开始定位,如果setScanSpan()大于1000会重复定位,除非stop //如果想单独一次,请求一次定位就行了 mLocationClient.requestLocation(); }
3:
记住了一定要在onDestroy 里面执行下面的,不然会一直定位的在Destory 里面:
mLocationClient.unRegisterLocationListener(this);
mLocationClient.stop();
@Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); mLocationClient.unRegisterLocationListener(this); mLocationClient.stop(); }