出現這個問題首先肯定已經添加了如下類似代碼了:
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" />