一 、Android 百度定位SDK
1 、开发文档
1.1 :申请密钥api key:http://lbsyun.baidu.com/apiconsole/key
1.2:配置环境:
1.2.1 :添加库文件
a) 在 相关下载下载最新 库文件。
b)使用Eclipse开发的开发者,将SO文件的压缩文件解压出来,把对应架构下的SO文件放入开发者自己APP的对应架构下的文件夹中(建议全部放入以提 高程序兼容性);将JAR文件拷贝到工程的libs目录下,这样即可在程序中使用Android定位SDK。
c)使用AndroidStutio的开发者除了上述操作外,还需要在build.gradle中配置SO文件的使用,如下所示:
如果开发的是系统应用,除了需要在工程中配置SO文件,还需要手动把对应架构的SO文件拷贝到/system/lib下,如果是64位系统,则需要将64位的 SO文件拷贝到/sytem/lib64下。
注意:新版本的定位SDK,开发者除了要更新JAR包之外,同时需要关注SO文件是否有更新。如果SO文件名称改变,即SO文件有更新,开发者要及 时替换掉老版本,否则会导致定位失败。
1.2.2 : 配置AndroidManifest文件
a) 在Application标签中声明Service组件,每个App都应该有单独一个定位Service。
b) 声明使用权限
2、代码集成
2.1 :创建定位LocationClient对象并初始化设置
/** * 创建定位对象 */ private LocationClient locationService; public void onStartLocation() { locationService = new LocationClient(getApplicationContext().getApplicationContext()); // 设置定位参数 setLocationOption(); // 定位回调 locationService.registerLocationListener(mListener); // 开启定位 // locationService.start(); }
/** * 设置定位参数 */ private void setLocationOption(){ LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//设置高精度定位定位模式 option.setOpenGps(true); option.setCoorType("bd09ll");//设置百度经纬度坐标系格式 // option.setScanSpan(1000*3);//设置发起定位请求的间隔时间为3秒 , 默认0,即仅定位一次, option.setIsNeedAddress(true);//反编译获得具体位置,只有网络定位才可以 option.setAddrType("all"); locationService.setLocOption(option); }
/** * 定位回调 */private BDLocationListener mListener = new BDLocationListener() { public void onReceiveLocation(BDLocation location) { }}
a):设置参数每间隔多少s定位一次: option.setScanSpan(1000*3)
b):开始定位:locationService.start()
c):停止定位:locationService.stop()
二 、Android 百度地图SDK
1、开发文档
1.1:在libs目录下添加 .jar包
工程配置还需要把jar包集成到自己的工程中,放入libs目录下。对于每个jar文件,右键-选择Add As Library,导入到工程中。对应在build.gradle生成工程所依赖的jar文件说明。
1.2:在libs目录下添加.so文件
在libs目录下放入对应不同CPU架构的so文件。这样工程并不会自动加载libs下的so,需在gradle编译时,通过加入代码:
jniLibs.srcDir 'libs' 来说明so的路径为该libs路径。
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
2、代码集成
2.1:初始化地图
/** * 关于地图 */ private MapView mMapView ; private BaiduMap mBaiduMap; private void setBaiduMap(){ mMapView = (MapView) findViewById(R.id.quyu_baidu_map); mBaiduMap = mMapView.getMap(); //设置为普通地图 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); //将地图放大为100m MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f); // 放大至200米 // 初始化反地理编码实例 geoCoder = GeoCoder.newInstance(); mBaiduMap.setMapStatus(msu); /** 添加长按地图监听 */ mBaiduMap.setOnMapLongClickListener(longListener); }
2.2:根据经纬度定位
/** * 根据经纬度定位 * @param location */ private MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.FOLLOWING;//当前定位的模式 private void locationMap(double lontitude , double latitude){ // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 构造定位数据 MyLocationData locData = new MyLocationData.Builder() .accuracy(RADIUS) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(0).latitude(latitude) .longitude(lontitude).build(); // 设置定位数据 mBaiduMap.setMyLocationData(locData); // 设置定位图层的配置(定位模式,是否允许方向信息,用户自定义定位图标) BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory .fromResource(R.drawable.icon_weizhi_2x_1); MyLocationConfiguration config = new MyLocationConfiguration(mCurrentMode, true, mCurrentMarker); mBaiduMap.setMyLocationConfigeration(config); }
2.3:地图长按事件的监听(更多请见百度地图事件监听)
/** * 地图长按事件监听回调函数 * @param point 长按的地理坐标 */ BaiduMap.OnMapLongClickListener longListener = new BaiduMap.OnMapLongClickListener() { public void onMapLongClick(LatLng point){ Toast.makeText(WuRaoQuYuUpdateActivity.this, "长按地图获取的 经度 = "+point.longitude+"\n纬度 = "+point.latitude,Toast.LENGTH_SHORT).show(); // 反地理位置编译 latlngToAddress(point); } };
/** * 反地理位置编译 * @param latlng */ private void latlngToAddress(final LatLng latlng) { // 设置反地理经纬度坐标,请求位置时,需要一个经纬度 geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(latlng)); //设置地址或经纬度反编译后的监听,这里有两个回调方法, geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() { /** 经纬度转换成地址 */ @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(WuRaoQuYuUpdateActivity.this, "找不到该地址!",Toast.LENGTH_SHORT).show(); } String address = result.getAddress(); Toast.makeText(WuRaoQuYuUpdateActivity.this , "长按地图获取的位置 = " + address , Toast.LENGTH_SHORT).show(); // 长按改变地址 将获得经纬度再地图显示 locationMap(latlng.longitude , latlng.latitude); } /** 把地址转换成经纬度 */ @Override public void onGetGeoCodeResult(GeoCodeResult result) { } }); }