出现这个问题首先肯定已经添加了如下类似代码了:
private String mLongitude = "";
private String mLatitude = "";
private String mAddress = "";
private LocationClient mLocationClient;
private void initLocation() {
//http://lbsyun.baidu.com/apiconsole/key——获取APP_KEY的网址
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);//可选,设置定位模式,默认高精度
option.setCoorType("bd09ll");//bd09ll:百度经纬度坐标;
option.setScanSpan(1000);//如果设置为0,则代表单次定位,即仅定位一次,默认为0,如果设置非0,需设置1000ms以上才有效
option.setOpenGps(true);//可选,设置是否使用gps,默认false,使用高精度和仅用设备两种定位模式的,参数必须设置为true
option.setLocationNotify(true);//可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
option.setIgnoreKillProcess(true);//可选,定位SDK内部是一个service,并放到了独立进程。//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
option.SetIgnoreCacheException(false);//可选,设置是否收集Crash信息,默认收集,即参数为false
option.setWifiCacheTimeOut(5 * 60 * 1000);//可选,7.2版本新增能力//如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位
option.setEnableSimulateGps(false);//可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
option.setIsNeedAddress(true);//可选,是否需要地址信息,默认为不需要,即参数为false//如果开发者需要获得当前点的地址信息,此处必须为true
mLocationClient.setLocOption(option);
mLocationClient.start();
}
public class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
double latitude = location.getLatitude(); //获取纬度信息24.488628
double longitude = location.getLongitude(); //获取经度信息118.181043
float radius = location.getRadius(); //获取定位精度,默认值为0.0f
mLatitude = String.valueOf(latitude);
mLongitude = String.valueOf(longitude);
//获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
String coorType = location.getCoorType();
//获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
int errorCode = location.getLocType();
mAddress = location.getAddrStr(); //获取详细地址信息
String country = location.getCountry(); //获取国家
String province = location.getProvince(); //获取省份
String city = location.getCity(); //获取城市
String district = location.getDistrict(); //获取区县
String street = location.getStreet(); //获取街道信息
mLocationClient.stop();
}
可以通过int errorCode = location.getLocType();查看错误代码,我的错误码是162,查看错误码说明:
http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/addition-func/error-code
162对应的解释是so文件加载失败,于是我检查了自己的so文件,是从其他项目拷过来的,只有armeabi平台,可是为什么另一个项目就没问题呢,明明一模一样的。我又解压了apk查看里面的libs,发现竟然有多个不同平台的目录,原来是项目中用了一个第三方框架,这个框架含有多个平台的so目录,于是造成了这个问题。现在知道解决办法了:
方法一:重新下载百度sdk,把全部的平台目录什么arm64-v8a,armeabi,armeabi-v7a,x86,x86_64全部拷到项目当中;
下载地址:http://lbsyun.baidu.com/index.php?title=sdk/download&action#selected=location_all
方法二:在build.gradle中指定CPU架构平台,比如:
defaultConfig {
......
ndk{
abiFilter("armeabi")
}
}
这样打包出来的libs当中就只有armeabi目录了
顺便记录下如何获取SHA1码:
cmd命令:keytool -list -v -keystore带上keystore或jks的路径,输入密钥就能获取到了
再记录下AndroidManifest.xml配置吧,百度定位需要的准备就这么多了
<!-- 百度地图 -->
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 百度地图 -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="my_api_key" />
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" />