成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

移動開發 Android
最近更新項目中用的百度定位SDK時遇見了一個奇葩的問題。當升級SDK后百度定位一直返回505,通過百度定位官網查看該碼表示AK非法或者不存在。很糾結,于是自己又寫了一個demo來研究一下百度定位以及大家使用百度定位經常出現的問題,特此記錄。上篇文章我先將百度定位的實現介紹了一下,本篇再分析遇到的問題及解決方案。

接上文

實現BDLocationListener接口 

  1. /***** 
  2.      * 定位結果回調,重寫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.                  * 時間也可以使用systemClock.elapsedRealtime()方法 獲取的是自從開機以來,每次回調的時間; 
  15.                  * location.getTime() 是指服務端出本次結果的時間,如果位置不發生變化,則時間不變 
  16.                  */ 
  17.                 sb.append(location.getTime()); 
  18.                 sb.append("\nlocType : ");// 定位類型 
  19.                 sb.append(location.getLocType()); 
  20.                 sb.append("\nlocType description : ");// *****對應的定位類型說明***** 
  21.                 //sb.append(location.getLocTypeDescription()); 
  22.                 sb.append("\nlatitude : ");// 緯度 
  23.                 sb.append(location.getLatitude()); 
  24.                 sb.append("\nlontitude : ");// 經度 
  25.                 sb.append(location.getLongitude()); 
  26.                 sb.append("\nradius : ");// 半徑 
  27.                 sb.append(location.getRadius()); 
  28.                 sb.append("\nCountryCode : ");// 國家碼 
  29.                 sb.append(location.getCountryCode()); 
  30.                 sb.append("\nCountry : ");// 國家名稱 
  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 : ");// 區 
  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: ");// *****返回用戶室內外判斷結果***** 
  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());// 位置語義化信息 
  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定位結果 
  54.                     sb.append("\nspeed : "); 
  55.                     sb.append(location.getSpeed());// 速度 單位:km/h 
  56.                     sb.append("\nsatellite : "); 
  57.                     sb.append(location.getSatelliteNumber());// 衛星數目 
  58.                     sb.append("\nheight : "); 
  59.                     sb.append(location.getAltitude());// 海拔高度 單位:米 
  60.                     sb.append("\ngps status : "); 
  61.                     //sb.append(location.getGpsAccuracyStatus());// *****gps質量判斷***** 
  62.                     sb.append("\ndescribe : "); 
  63.                     sb.append("gps定位成功"); 
  64.                 } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 網絡定位結果 
  65.                     // 運營商信息 
  66.                     if (location.hasAltitude()) {// *****如果有海拔高度***** 
  67.                         sb.append("\nheight : "); 
  68.                         sb.append(location.getAltitude());// 單位:米 
  69.                     } 
  70.                     sb.append("\noperationers : ");// 運營商信息 
  71.                     sb.append(location.getOperators()); 
  72.                     sb.append("\ndescribe : "); 
  73.                     sb.append("網絡定位成功"); 
  74.                 } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 離線定位結果 
  75.                     sb.append("\ndescribe : "); 
  76.                     sb.append("離線定位成功,離線定位結果也是有效的"); 
  77.                 } else if (location.getLocType() == BDLocation.TypeServerError) { 
  78.                     sb.append("\ndescribe : "); 
  79.                     sb.append("服務端網絡定位失敗,可以反饋IMEI號和大體定位時間到loc-bugs@baidu.com,會有人追查原因"); 
  80.                 } else if (location.getLocType() == BDLocation.TypeNetWorkException) { 
  81.                     sb.append("\ndescribe : "); 
  82.                     sb.append("網絡不同導致定位失敗,請檢查網絡是否通暢"); 
  83.                 } else if (location.getLocType() == BDLocation.TypeCriteriaException) { 
  84.                     sb.append("\ndescribe : "); 
  85.                     sb.append("無法獲取有效定位依據導致定位失敗,一般是由于手機的原因,處于飛行模式下一般會造成這種結果,可以試著重啟手機"); 
  86.                 } 
  87.                 tv_location.setText(sb+"\n定位結束"); 
  88.                 locationService.stop(); 
  89.             }else
  90.                 tv_location.setText("\n定位失敗"); 
  91.             } 
  92.         } 
  93.   
  94.     };  

通過上面的實現后,我們在想要定位的地方注冊下回調,并調用start()方法即可以獲取位置了,我對注冊開始暫停做了下簡單封裝,具體代碼參考LocationService。如果要寫的項目里也要把回調接口封裝,自定義一個接口回調返回定位后的詳細位置信息。到這里即可成功定位了,下面就開始介紹下這個過程會出現的問題。

定位問題分析

在分析之前我們先看下百度定位返回的錯誤碼,分析定位的問題也就是分析出現錯誤碼的原因。

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

其實知道上面錯誤碼代表的含義后,我們就很快速的定位問題出現地方。當然有些時候不如此,可能需要走一些彎路。

505錯誤

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

 

 

 

如上圖,這上面顯示的SHA1的值應該和你開發版或者發布版中至少其中的一個相同。否則V7.0定位就不會成功。校驗工具百度網盤下載鏈接,提取碼:je4r。

162錯誤

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

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

 

 

 

 

其實最多出現的問題也就是這兩種情況。正常情況下百度定位成功返回的是161也就是網絡定位結果(如上圖),但是有時候無網絡會返回66機離線定位結果,離線定位是小區定位,需要手機手機中有SIM卡,否則不會返回66,你可以嘗試下,把手機調到飛行模式,發現離線定位會失敗。百度定位默認GPS定位是關閉的,如果想用GPS定位可以通過下面代碼打開,

  1. locationClientOption.setOpenGps(true); 

BDLocationListener只回調一次

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

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

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

責任編輯:龐桂玉 來源: 安卓開發精選
相關推薦

2016-12-20 14:30:40

2017-11-17 10:04:17

百度世界大會百度AI

2025-02-26 12:06:07

2023-03-06 07:50:19

內存回收Go

2015-12-14 13:54:51

百度運維大數據

2018-09-30 15:37:07

數據庫MySQLMyCat

2022-04-26 21:49:55

Spring事務數據庫

2023-01-18 23:20:25

編程開發

2020-09-15 08:46:26

Kubernetes探針服務端

2023-02-20 08:11:04

2021-10-28 19:10:02

Go語言編碼

2017-05-05 08:12:51

Spark共享變量

2011-09-26 10:05:19

百度地圖API

2013-04-08 14:59:54

Android學習筆記百度地圖Overlay

2021-09-03 11:15:18

場景sql配置

2024-04-10 08:39:56

BigDecimal浮點數二進制

2024-04-01 08:05:27

Go開發Java

2011-06-28 16:51:08

SEO

2013-01-09 15:46:02

Android百度定位SDKGPS

2013-08-22 17:08:50

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕日韩一区二区 | 久久久.com| 国产精彩视频 | 亚洲精品视频在线播放 | 精品久久香蕉国产线看观看亚洲 | 在线国产一区二区 | 亚洲欧美日韩精品久久亚洲区 | 黄色大片免费播放 | 欧美一区二区在线 | 麻豆一区二区三区 | www久久av| 亚洲一区二区在线视频 | 日韩精品色网 | 韩日一区 | 黄色小视频大全 | 欧美中文字幕一区二区三区亚洲 | 国产成人精品免费视频大全最热 | 亚洲一二三区精品 | 中文字幕在线精品 | 日p视频免费看 | 成人在线视频免费观看 | 亚洲一卡二卡 | 亚洲性人人天天夜夜摸 | 一二区视频 | 久久精品97 | 国内精品免费久久久久软件老师 | 欧美精品综合在线 | 中文字幕一区二区三区精彩视频 | 久久中文网 | 久久精品一级 | 国产xxxx在线 | 在线观看亚洲专区 | 不卡视频一区二区三区 | 免费观看羞羞视频网站 | 欧美黄色片 | 99精品国自产在线 | 免费久久久 | 国产日韩欧美精品 | 99re国产视频 | 亚洲精品成人 | 国产资源在线视频 |