自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

重拾百度定位之踩坑篇(下)

移動(dòng)開(kāi)發(fā) Android
最近更新項(xiàng)目中用的百度定位SDK時(shí)遇見(jiàn)了一個(gè)奇葩的問(wèn)題。當(dāng)升級(jí)SDK后百度定位一直返回505,通過(guò)百度定位官網(wǎng)查看該碼表示AK非法或者不存在。很糾結(jié),于是自己又寫(xiě)了一個(gè)demo來(lái)研究一下百度定位以及大家使用百度定位經(jīng)常出現(xiàn)的問(wèn)題,特此記錄。上篇文章我先將百度定位的實(shí)現(xiàn)介紹了一下,本篇再分析遇到的問(wèn)題及解決方案。

接上文

實(shí)現(xiàn)BDLocationListener接口 

  1. /***** 
  2.      * 定位結(jié)果回調(diào),重寫(xiě)onReceiveLocation方法 
  3.      * 
  4.      */ 
  5.     private BDLocationListener mListener = new BDLocationListener() { 
  6.   
  7.         @Override 
  8.         public void onReceiveLocation(BDLocation location) { 
  9.             // TODO Auto-generated method stub 
  10.             if (null != location ) { 
  11.                 StringBuffer sb = new StringBuffer(256); 
  12.                 sb.append("time : "); 
  13.                 /** 
  14.                  * 時(shí)間也可以使用systemClock.elapsedRealtime()方法 獲取的是自從開(kāi)機(jī)以來(lái),每次回調(diào)的時(shí)間; 
  15.                  * location.getTime() 是指服務(wù)端出本次結(jié)果的時(shí)間,如果位置不發(fā)生變化,則時(shí)間不變 
  16.                  */ 
  17.                 sb.append(location.getTime()); 
  18.                 sb.append("\nlocType : ");// 定位類(lèi)型 
  19.                 sb.append(location.getLocType()); 
  20.                 sb.append("\nlocType description : ");// *****對(duì)應(yīng)的定位類(lèi)型說(shuō)明***** 
  21.                 //sb.append(location.getLocTypeDescription()); 
  22.                 sb.append("\nlatitude : ");// 緯度 
  23.                 sb.append(location.getLatitude()); 
  24.                 sb.append("\nlontitude : ");// 經(jīng)度 
  25.                 sb.append(location.getLongitude()); 
  26.                 sb.append("\nradius : ");// 半徑 
  27.                 sb.append(location.getRadius()); 
  28.                 sb.append("\nCountryCode : ");// 國(guó)家碼 
  29.                 sb.append(location.getCountryCode()); 
  30.                 sb.append("\nCountry : ");// 國(guó)家名稱(chēng) 
  31.                 sb.append(location.getCountry()); 
  32.                 sb.append("\ncitycode : ");// 城市編碼 
  33.                 sb.append(location.getCityCode()); 
  34.                 sb.append("\ncity : ");// 城市 
  35.                 sb.append(location.getCity()); 
  36.                 sb.append("\nDistrict : ");// 區(qū) 
  37.                 sb.append(location.getDistrict()); 
  38.                 sb.append("\nStreet : ");// 街道 
  39.                 sb.append(location.getStreet()); 
  40.                 sb.append("\naddr : ");// 地址信息 
  41.                 sb.append(location.getAddrStr()); 
  42.                 sb.append("\nUserIndoorState: ");// *****返回用戶(hù)室內(nèi)外判斷結(jié)果***** 
  43.                 //sb.append(location.getUserIndoorState()); 
  44.                 sb.append("\nDirection(not all devices have value): "); 
  45.                 sb.append(location.getDirection());// 方向 
  46.                 sb.append("\nlocationdescribe: "); 
  47.                 sb.append(location.getLocationDescribe());// 位置語(yǔ)義化信息 
  48.                 sb.append("\nPoi: ");// POI信息 
  49.                 if (location.getPoiList() != null && !location.getPoiList().isEmpty()) { 
  50.                     for (int i = 0; i append(poi.getName() + ";"); 
  51.                     } 
  52.    } 
  53.                 if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位結(jié)果 
  54.                     sb.append("\nspeed : "); 
  55.                     sb.append(location.getSpeed());// 速度 單位:km/h 
  56.                     sb.append("\nsatellite : "); 
  57.                     sb.append(location.getSatelliteNumber());// 衛(wèi)星數(shù)目 
  58.                     sb.append("\nheight : "); 
  59.                     sb.append(location.getAltitude());// 海拔高度 單位:米 
  60.                     sb.append("\ngps status : "); 
  61.                     //sb.append(location.getGpsAccuracyStatus());// *****gps質(zhì)量判斷***** 
  62.                     sb.append("\ndescribe : "); 
  63.                     sb.append("gps定位成功"); 
  64.                 } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 網(wǎng)絡(luò)定位結(jié)果 
  65.                     // 運(yùn)營(yíng)商信息 
  66.                     if (location.hasAltitude()) {// *****如果有海拔高度***** 
  67.                         sb.append("\nheight : "); 
  68.                         sb.append(location.getAltitude());// 單位:米 
  69.                     } 
  70.                     sb.append("\noperationers : ");// 運(yùn)營(yíng)商信息 
  71.                     sb.append(location.getOperators()); 
  72.                     sb.append("\ndescribe : "); 
  73.                     sb.append("網(wǎng)絡(luò)定位成功"); 
  74.                 } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 離線(xiàn)定位結(jié)果 
  75.                     sb.append("\ndescribe : "); 
  76.                     sb.append("離線(xiàn)定位成功,離線(xiàn)定位結(jié)果也是有效的"); 
  77.                 } else if (location.getLocType() == BDLocation.TypeServerError) { 
  78.                     sb.append("\ndescribe : "); 
  79.                     sb.append("服務(wù)端網(wǎng)絡(luò)定位失敗,可以反饋IMEI號(hào)和大體定位時(shí)間到loc-bugs@baidu.com,會(huì)有人追查原因"); 
  80.                 } else if (location.getLocType() == BDLocation.TypeNetWorkException) { 
  81.                     sb.append("\ndescribe : "); 
  82.                     sb.append("網(wǎng)絡(luò)不同導(dǎo)致定位失敗,請(qǐng)檢查網(wǎng)絡(luò)是否通暢"); 
  83.                 } else if (location.getLocType() == BDLocation.TypeCriteriaException) { 
  84.                     sb.append("\ndescribe : "); 
  85.                     sb.append("無(wú)法獲取有效定位依據(jù)導(dǎo)致定位失敗,一般是由于手機(jī)的原因,處于飛行模式下一般會(huì)造成這種結(jié)果,可以試著重啟手機(jī)"); 
  86.                 } 
  87.                 tv_location.setText(sb+"\n定位結(jié)束"); 
  88.                 locationService.stop(); 
  89.             }else
  90.                 tv_location.setText("\n定位失敗"); 
  91.             } 
  92.         } 
  93.   
  94.     };  

通過(guò)上面的實(shí)現(xiàn)后,我們?cè)谙胍ㄎ坏牡胤阶?cè)下回調(diào),并調(diào)用start()方法即可以獲取位置了,我對(duì)注冊(cè)開(kāi)始暫停做了下簡(jiǎn)單封裝,具體代碼參考LocationService。如果要寫(xiě)的項(xiàng)目里也要把回調(diào)接口封裝,自定義一個(gè)接口回調(diào)返回定位后的詳細(xì)位置信息。到這里即可成功定位了,下面就開(kāi)始介紹下這個(gè)過(guò)程會(huì)出現(xiàn)的問(wèn)題。

定位問(wèn)題分析

在分析之前我們先看下百度定位返回的錯(cuò)誤碼,分析定位的問(wèn)題也就是分析出現(xiàn)錯(cuò)誤碼的原因。

  1. 獲取定位返回錯(cuò)誤碼:: 
  2. public int getLocType ( ) 
  3. 返回值: 
  4. 61 : GPS定位結(jié)果,GPS定位成功。 
  5. 62 : 無(wú)法獲取有效定位依據(jù),定位失敗,請(qǐng)檢查運(yùn)營(yíng)商網(wǎng)絡(luò)或者WiFi網(wǎng)絡(luò)是否正常開(kāi)啟,嘗試重新請(qǐng)求定位。 
  6. 63 : 網(wǎng)絡(luò)異常,沒(méi)有成功向服務(wù)器發(fā)起請(qǐng)求,請(qǐng)確認(rèn)當(dāng)前測(cè)試手機(jī)網(wǎng)絡(luò)是否通暢,嘗試重新請(qǐng)求定位。 
  7. 65 : 定位緩存的結(jié)果。 
  8. 66 : 離線(xiàn)定位結(jié)果。通過(guò)requestOfflineLocaiton調(diào)用時(shí)對(duì)應(yīng)的返回結(jié)果。 
  9. 67 : 離線(xiàn)定位失敗。通過(guò)requestOfflineLocaiton調(diào)用時(shí)對(duì)應(yīng)的返回結(jié)果。 
  10. 68 : 網(wǎng)絡(luò)連接失敗時(shí),查找本地離線(xiàn)定位時(shí)對(duì)應(yīng)的返回結(jié)果。 
  11. 161: 網(wǎng)絡(luò)定位結(jié)果,網(wǎng)絡(luò)定位成功。 
  12. 162: 請(qǐng)求串密文解析失敗,一般是由于客戶(hù)端SO文件加載失敗造成,請(qǐng)嚴(yán)格參照開(kāi)發(fā)指南或demo開(kāi)發(fā),放入對(duì)應(yīng)SO文件。 
  13. 167: 服務(wù)端定位失敗,請(qǐng)您檢查是否禁用獲取位置信息權(quán)限,嘗試重新請(qǐng)求定位。 
  14. 502: AK參數(shù)錯(cuò)誤,請(qǐng)按照說(shuō)明文檔重新申請(qǐng)AK。 
  15. 505:AK不存在或者非法,請(qǐng)按照說(shuō)明文檔重新申請(qǐng)AK。 
  16. 601: AK服務(wù)被開(kāi)發(fā)者自己禁用,請(qǐng)按照說(shuō)明文檔重新申請(qǐng)AK。 
  17. 602: key mcode不匹配,您的AK配置過(guò)程中安全碼設(shè)置有問(wèn)題,請(qǐng)確保:SHA1正確,“;”分號(hào)是英文狀態(tài);且包名是您當(dāng)前運(yùn)行應(yīng)用的包名,請(qǐng)按照說(shuō)明文檔重新申請(qǐng)AK。 
  18. 501~700:AK驗(yàn)證失敗,請(qǐng)按照說(shuō)明文檔重新申請(qǐng)AK。  

其實(shí)知道上面錯(cuò)誤碼代表的含義后,我們就很快速的定位問(wèn)題出現(xiàn)地方。當(dāng)然有些時(shí)候不如此,可能需要走一些彎路。

505錯(cuò)誤

在我升級(jí)定位SDK版本后遇到得到就是這個(gè)問(wèn)題,沒(méi)有更改任何代碼但是就是一直返回錯(cuò)誤碼是505.通過(guò)上面錯(cuò)誤碼表我們看到時(shí)AK不存在或者非法,但是依然很糾結(jié),因?yàn)榇a時(shí)點(diǎn)兒也沒(méi)有改,只是替換了jar和.so文件為最新版就不能用了。定位一直返回505,最后在官網(wǎng)更新日志看到V7.0版本有一條記錄 是優(yōu)化、完善AK校驗(yàn)機(jī)制,充分保證開(kāi)發(fā)者合法權(quán)益,保證開(kāi)發(fā)者應(yīng)用的安全性。具體怎么優(yōu)化并沒(méi)有說(shuō)明。不過(guò)也能猜測(cè)應(yīng)該是SHA1的值問(wèn)題。我先將demo用的定位SDK用V6.2.2(項(xiàng)目中用的此版本),然后更改SHA1的值,不管怎么改依然能成功定位。但是更改為了V7.0版本發(fā)現(xiàn)SHA1的值并不能隨便改,只能是運(yùn)行程序用的key文件的SHA1的值,否則就出現(xiàn)505錯(cuò)誤。至此問(wèn)題解決。在V7.0之前版本雖說(shuō)讓填寫(xiě)SHA1的值,但是并沒(méi)有什么有效作用,在V7.0版本開(kāi)始加入了嚴(yán)格的校驗(yàn)。在這里提供一個(gè)軟件可以校驗(yàn)APK的SHA1值,他提供了SHA1的和AK的校驗(yàn)功能。 

 

 

 

如上圖,這上面顯示的SHA1的值應(yīng)該和你開(kāi)發(fā)版或者發(fā)布版中至少其中的一個(gè)相同。否則V7.0定位就不會(huì)成功。校驗(yàn)工具百度網(wǎng)盤(pán)下載鏈接,提取碼:je4r。

162錯(cuò)誤

162錯(cuò)誤一般是.so文件加載失敗引起的。在AndroidStudio中.so文件的位置和Eclipse中的是不一樣的。默認(rèn)情況下,AndroidStudio中.so文件放在main目錄下,在該文件夾下創(chuàng)建jniLibs,然后將不同內(nèi)核的.so文件放到該文件夾下就可以了。當(dāng)然一些人延續(xù)了Eclipse位置,將.so文件放置在libs目錄下,如果此時(shí)沒(méi)有其他一些配置.so文件是不能加載的。此時(shí)再gradle文件加入下面代碼即可

  1. sourceSets { 
  2.         main { 
  3.             jniLibs.srcDirs = ['libs'
  4.         } 
  5.     }  

 

 

 

 

其實(shí)最多出現(xiàn)的問(wèn)題也就是這兩種情況。正常情況下百度定位成功返回的是161也就是網(wǎng)絡(luò)定位結(jié)果(如上圖),但是有時(shí)候無(wú)網(wǎng)絡(luò)會(huì)返回66機(jī)離線(xiàn)定位結(jié)果,離線(xiàn)定位是小區(qū)定位,需要手機(jī)手機(jī)中有SIM卡,否則不會(huì)返回66,你可以嘗試下,把手機(jī)調(diào)到飛行模式,發(fā)現(xiàn)離線(xiàn)定位會(huì)失敗。百度定位默認(rèn)GPS定位是關(guān)閉的,如果想用GPS定位可以通過(guò)下面代碼打開(kāi),

  1. locationClientOption.setOpenGps(true); 

BDLocationListener只回調(diào)一次

對(duì)于很多剛接觸定位的人可能還會(huì)遇到一個(gè)問(wèn)題就是,為何多次調(diào)用start()方法但是BDLocationListener回調(diào)只執(zhí)行一次。每次只要程序剛啟動(dòng)時(shí)才能定位成功。之后再定位就沒(méi)有反應(yīng)了。如果你第一次遇到這個(gè)問(wèn)題,確實(shí)很棘手,不管怎么改定位相關(guān)的代碼,并不能解決問(wèn)題。其實(shí)此時(shí)只需要在清單文件加入下面代碼既可以解決BDLocationListener只會(huì)回調(diào)一次的問(wèn)題

  1. <service 
  2.             android:name="com.baidu.location.f" 
  3.             android:enabled="true" 
  4.             android:process=":remote" > 
  5.         </service>  

好了,到此,本篇文章真的結(jié)束了,若文章有不足或者錯(cuò)誤的地方,歡迎指正,以防止給其他讀者錯(cuò)誤引導(dǎo)

責(zé)任編輯:龐桂玉 來(lái)源: 安卓開(kāi)發(fā)精選
相關(guān)推薦

2016-12-20 14:30:40

2017-11-17 10:04:17

百度世界大會(huì)百度AI

2025-02-26 12:06:07

2023-03-06 07:50:19

內(nèi)存回收Go

2015-12-14 13:54:51

百度運(yùn)維大數(shù)據(jù)

2018-09-30 15:37:07

數(shù)據(jù)庫(kù)MySQLMyCat

2022-04-26 21:49:55

Spring事務(wù)數(shù)據(jù)庫(kù)

2023-01-18 23:20:25

編程開(kāi)發(fā)

2020-09-15 08:46:26

Kubernetes探針服務(wù)端

2023-02-20 08:11:04

2017-05-05 08:12:51

Spark共享變量

2021-10-28 19:10:02

Go語(yǔ)言編碼

2024-04-10 08:39:56

BigDecimal浮點(diǎn)數(shù)二進(jìn)制

2021-09-03 11:15:18

場(chǎng)景sql配置

2024-04-01 08:05:27

Go開(kāi)發(fā)Java

2013-01-09 15:46:02

Android百度定位SDKGPS

2011-09-26 10:05:19

百度地圖API

2013-04-08 14:59:54

Android學(xué)習(xí)筆記百度地圖Overlay

2017-07-17 15:46:20

Oracle并行機(jī)制

2023-09-22 11:29:11

JavasubList
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)