引入騰訊地圖定位SDK文檔
官方API接口地址
引入步驟
申請Key
1. 登錄騰訊位置服務(wù)
登錄方式支持:QQ、微信、手機。
2. 驗證手機與郵箱
驗證手機與郵箱申請成為開發(fā)者,同時也可以進行企業(yè)認(rèn)證,獲取更多服務(wù)。
成為企業(yè)用戶。
個人開發(fā)者免費調(diào)用量1萬/天,并發(fā)量5次/秒。(下表為個人開發(fā)者配額表)
| 接口 | 免費額度與用量(次/日) | 并發(fā)配額(次/秒) | 接口解釋 |
|---|---|---|---|
| 坐標(biāo)轉(zhuǎn)換 | 1w | 5 | 實現(xiàn)從其它地圖供應(yīng)商坐標(biāo)系或標(biāo)準(zhǔn)GPS坐標(biāo)系,批量轉(zhuǎn)換到騰訊地圖坐標(biāo)系 |
| 逆地址解析(位置描述) | 1w | 5 | 本接口提供由坐標(biāo)到坐標(biāo)所在位置的文字描述的轉(zhuǎn)換。輸入坐標(biāo)返回地理位置信息和附近poi列表 |
| 地址解析 | 1w | 5 | 本接口提供由地址描述到所述位置坐標(biāo)的轉(zhuǎn)換,與逆地址解析的過程正好相反 |
| IP定位 | 1w | 5 | 通過終端設(shè)備IP地址獲取其當(dāng)前所在地理位置,精確到市級,常用于顯示當(dāng)?shù)爻鞘刑鞖忸A(yù)報、初始化用戶城市等非精確定位場景 |
企業(yè)開發(fā)者免費調(diào)用量30萬/天,并發(fā)量50次/秒,企業(yè)開發(fā)者還可以付費購買配額(配額價格只有企業(yè)開發(fā)者才可以查詢)。
3. 申請開發(fā)密鑰(key)
成為開發(fā)者之后,在控制臺的key管理中就可以申請創(chuàng)建新密鑰。
導(dǎo)入庫文件
? 庫文件下載地址
? 找到開發(fā)包中的 libtencentloc.zip文件夾,拷貝相應(yīng)目錄下的so文件到目標(biāo)工程中的 libs目錄下。
? 找到開發(fā)包中的 TencentLocationSDK_v4.3.0_r196568.jar 文件,拷貝到目標(biāo)工程中的 libs 目錄下。
? 注意: 如果 TencentLocationSDK_v4.3.0_r196568.jar沒有自動加入到工程的 build path 中,則需要手動添 加。手動添加的步驟如下:右擊工程,在 工程屬性->Java Build Path->Libraries中選擇“Add External JARs”,選定 TencentLocationSDK_v4.3.0_r196568.jar,確定后返回。這樣您就可以在程序中使用騰訊地圖定位SDK了。
配置權(quán)限
<!-- 通過GPS得到精確位置 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 通過網(wǎng)絡(luò)得到粗略位置 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 訪問網(wǎng)絡(luò),某些位置信息需要從網(wǎng)絡(luò)服務(wù)器獲取 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 訪問WiFi狀態(tài),需要WiFi信息用于網(wǎng)絡(luò)定位 --> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 修改WiFi狀態(tài),發(fā)起WiFi掃描, 需要WiFi信息用于網(wǎng)絡(luò)定位 --> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 訪問網(wǎng)絡(luò)狀態(tài), 檢測網(wǎng)絡(luò)的可用性,需要網(wǎng)絡(luò)運營商相關(guān)信息用于網(wǎng)絡(luò)定位 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 訪問網(wǎng)絡(luò)的變化, 需要某些信息用于網(wǎng)絡(luò)定位 --> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 訪問手機當(dāng)前狀態(tài), 需要某些信息用于網(wǎng)絡(luò)定位 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
配置Key
<application>
...
<meta-data android:name="TencentMapSDK" android:value="您申請的Key"/>
</application>
添加混淆
-keepclassmembers class ** {
public void on*Event(...);
}
-keep class c.t.**{*;}
-keep class com.tencent.map.geolocation.**{*;}
-keep class com.tencent.tencentmap.lbssdk.service.**{*;}
-dontwarn org.eclipse.jdt.annotation.**
-dontwarn c.t.**
功能說明
創(chuàng)建位置監(jiān)聽器
TencentLocationListener,這是一個接口,需要實現(xiàn)一下方法:
-
位置更新回調(diào)
public void onLocationChanged(TencentLocation location, int error, String reason)參數(shù) 含義 location 新的位置 error 錯誤碼 reason 錯誤描述 GPS和WIFI狀態(tài)回調(diào)
-
public void onStatusUpdate(String name, int status, String desc)參數(shù) 含義 name GPS,Wi-Fi等 status 新的狀態(tài), 啟用或禁用 desc 狀態(tài)描述 在Android 6.0 及以上的系統(tǒng)版本中,當(dāng)位置開關(guān)關(guān)閉時,onStatusUpdate接口會返回name=wifi,status=5,該狀態(tài)碼說明位置開關(guān)關(guān)閉,此時無法進行Wi-Fi掃描。收到該狀態(tài)碼后,請及時提醒用戶打開位置開關(guān)。
| Name | status | |||
|---|---|---|---|---|
| 狀態(tài) | 狀態(tài)碼 | 說明 | ||
| cell | STATUS_DISABLED | 0 | 模塊關(guān)閉 | |
| STATUS_EABLED | 1 | 模塊開啟 | ||
| STATUS_DENIED | 2 | 定位權(quán)限被禁止,位置權(quán)限被拒絕通常發(fā)生在禁用當(dāng)前應(yīng)用的 ACCESS_COARSE_LOCATION 等定位權(quán)限 | ||
| wifi | STATUS_DISABLED | 0 | Wi-Fi開關(guān)關(guān)閉 | |
| STATUS_EABLED | 1 | Wi-Fi開關(guān)打開 | ||
| STATUS_DENIED | 2 | 權(quán)限被禁止,禁用當(dāng)前應(yīng)用的 ACCESS_COARSE_LOCATION 等定位權(quán)限 | ||
| STATUS_LOCATION_SWITCH_OFF | 5 | 位置信息開關(guān)關(guān)閉,在android M系統(tǒng)中,此時禁止進行Wi-Fi掃描 | ||
| GPS | STATUS_DISABLED | 0 | GPS開關(guān)關(guān)閉 | |
| STATUS_EABLED | 1 | GPS開關(guān)打開 | ||
| STATUS_GPS_AVAILABEL | 3 | GPS可用,代表GPS開關(guān)打開,且搜星定位成功 | ||
| STATUS_GPS_UNAVAILABLE | 4 | GPS不可用,不可用有多種可能,比如: GPS開關(guān)被關(guān)閉,GPS開關(guān)開著但是沒辦法搜星或者在室內(nèi)等定位不成功的情況 |
創(chuàng)建定位請求
TencentLocationRequest 類代表定位請求, 您的APP通過向定位SDK發(fā)送定位請求來啟動定位。通常您只需獲取 TencentLocationRequest 實例即可,如下所示:
TencentLocationRequest request = TencentLocationRequest.create()
以上得到的是一個缺省的定位請求,缺省的定位請求各參數(shù)如下:
- 定位周期(位置監(jiān)聽器回調(diào)周期): 10秒
- Request Level: REQUEST_LEVEL_NAME
- 緩存: 允許使用緩存
- QQ: 空字符串
可調(diào)用如下方法來對定位請求進行自定義配置:
| 方法名 | 功能 |
|---|---|
| setInterval | 設(shè)置定位周期(位置監(jiān)聽器回調(diào)周期), 單位為 ms (毫秒) |
| setRequestLevel | 設(shè)置定位的 request level |
| setAllowCache | 設(shè)置是否允許使用緩存, 連續(xù)多次定位時建議允許緩存 |
| setQQ | 設(shè)置 QQ 號 |
Request level 決定定位結(jié)果中包含哪些信息,分為以下幾類:
| Request Level | 值 | 含義 |
|---|---|---|
| REQ_LEVEL_GEO | 0 | 包含經(jīng)緯度 ,例:經(jīng)度:40.050486,緯度:116.298929 |
| REQ_LEVEL_NAME | 1 | 包含經(jīng)緯度, 位置名稱, 位置地址 |
| REQ_LEVEL_ADMIN_AREA | 3 | 包含經(jīng)緯度,位置所處的中國大陸行政區(qū)劃 |
| REQ_LEVEL_POI | 4 | 包含經(jīng)緯度,位置所處的中國大陸行政區(qū)劃及周邊POI列表 |
注冊位置監(jiān)聽器
TencentLocationManager 類代表騰訊定位服務(wù)。注冊位置監(jiān)聽器前需要獲取 TencentLocationManager 實例,示例如下:
Context context = ...
TencentLocationListener listener = ...
TencentLocationRequest request = ...
TencentLocationManager locationManager = TencentLocationManager.getInstance(context);
int error = locationManager.requestLocationUpdates(request, listener);
返回值為0時表示位置監(jiān)聽器注冊成功。注冊成功之后,在位置發(fā)生變化時,位置監(jiān)聽器的位置回調(diào)接口或狀態(tài)回調(diào)接口將會被調(diào)用,用以接收最新的位置或狀態(tài)。
返回值非0時表示位置監(jiān)聽器注冊失敗。注冊監(jiān)聽器失敗時,將無法接收到位置更新,繼續(xù)使用騰訊地圖定位SDK前您應(yīng)先排查注冊失敗的問題。常見的返回值如下:
| 返回值 | 含義 |
|---|---|
| 0 | 注冊位置監(jiān)聽器成功 |
| 1 | 設(shè)備缺少使用騰訊定位SDK需要的基本條件 |
| 2 | 配置的 Key 不正確 |
| 3 | 自動加載libtencentloc.so失敗,可能由以下原因造成: 1、這往往是由工程中的so與設(shè)備不兼容造成的,應(yīng)該添加相應(yīng)版本so文件; 2、如果您使用AndroidStudio,可能是gradle沒有正確指向so文件加載位置,可以按照這里配置您的gradle; |
獲取定位結(jié)果
通過位置監(jiān)聽器的位置回調(diào)接口獲取定位結(jié)果。使用定位結(jié)果前應(yīng)當(dāng)先檢查錯誤碼:
@Override
public void onLocationChanged(TencentLocation location, int error, String reason) {
if (TencentLocation.ERROR_OK == error) {
// 定位成功
} else {
// 定位失敗
}
}
錯誤碼說明
錯誤碼來自 TencentLocation 的 ERROR_XXX 常量,分如下幾種情形:
| 錯誤碼 | 值 | 含義 |
|---|---|---|
| ERROR_OK | 0 | 定位成功 |
| ERROR_NETWORK | 1 | 網(wǎng)絡(luò)問題引起的定位失敗 |
| ERROR_BAD_JSON | 2 | GPS, Wi-Fi 或基站錯誤引起的定位失敗: 1、用戶的手機確實采集不到定位憑據(jù),比如偏遠(yuǎn)地區(qū)比如地下車庫電梯內(nèi)等; 2、開關(guān)跟權(quán)限問題,比如用戶關(guān)閉了位置信息,關(guān)閉了Wi-Fi,未授予app定位權(quán)限等。 |
| ERROR_WGS84 | 4 | 無法將WGS84坐標(biāo)轉(zhuǎn)換成GCJ-02坐標(biāo)時的定位失敗 |
| ERROR_UNKNOWN | 404 | 未知原因引起的定位失敗 |
request level 說明
request level 來自 TencentLocationRequest 的 REQUEST_LEVEL_XXX 常量,分如下幾種情形:
| Request Level | 值 | 含義 |
|---|---|---|
| REQ_LEVEL_GEO | 0 | 包含經(jīng)緯度 |
| REQ_LEVEL_NAME | 1 | 包含經(jīng)緯度, 位置名稱, 位置地址 |
| REQ_LEVEL_ADMIN_AREA | 3 | 包含經(jīng)緯度,位置所處的中國大陸行政區(qū)劃 |
| REQ_LEVEL_POI | 4 | 包含經(jīng)緯度,位置所處的中國大陸行政區(qū)劃及周邊POI列表 |
- 當(dāng)定位請求的 request level 為 REQ_LEVEL_GEO 時,以下字段有效:
精度:通常精度為:GPS:<20米,WiFi:30-180米,基站:150-800米.
| 字段 | 含義 | 例 |
|---|---|---|
| latitude | 緯度 | 40.050486 |
| longitude | 經(jīng)度 | 116.299057 |
| altitude | 海拔 | 0.0 |
| accuracy | 精度 | 30.0 |
- 當(dāng)定位請求的 request level 為 REQ_LEVEL_NAME 時,以下字段有效:
| 字段 | 含義 | 例 |
|---|---|---|
| latitude | 緯度 | 40.050486 |
| longitude | 經(jīng)度 | 116.299057 |
| altitude | 海拔 | 0.0 |
| accuracy | 精度 | 30.0 |
| name | 名稱 | 上地科技大廈 |
| address | 地址 | 北京市海淀區(qū)上地西街8 |
- 當(dāng)定位請求的 request level 為 REQ_LEVEL_ADMIN_AREA 時,以下字段有效:
| 字段 | 含義 | 例 |
|---|---|---|
| latitude | 緯度 | 40.050486 |
| longitude | 經(jīng)度 | 116.299057 |
| altitude | 海拔 | 0.0 |
| accuracy | 精度 | 30.0 |
| nation | 國家 | 中國 |
| province | 省 | 北京市 |
| city | 市 | 北京市 |
| district | 區(qū) | 海淀區(qū) |
| town | 鎮(zhèn) | Unknown |
| village | 村 | Unknown |
| street | 街道 | 上地西路 |
| streetNo | 門號 | 上地西街8號 |
- 當(dāng)定位請求的 request level 為 REQ_LEVEL_POI 時,以下字段有效:
| 字段 | 含義 | 例 |
|---|---|---|
| latitude | 緯度 | 40.050486 |
| longitude | 經(jīng)度 | 116.299057 |
| altitude | 海拔 | 0.0 |
| accuracy | 精度 | 30.0 |
| nation | 國家 | 中國 |
| province | 省 | 北京市 |
| city | 市 | 北京市 |
| district | 區(qū) | 海淀區(qū) |
| town | 鎮(zhèn) | Unknown |
| village | 村 | Unknown |
| street | 街道 | 上地西路 |
| streetNo | 門號 | 上地西街8號 |
| poiList | POI 列表 |
-
刪除位置監(jiān)聽器
定位完成后,無論成功或失敗,都應(yīng)當(dāng)盡快刪除之前注冊的位置監(jiān)聽器。代碼如下:
Context context = ... TencentLocationListener listener = ... TencentLocationManager locationManager = TencentLocationManager.getInstance(context); locationManager.removeUpdates(listener);
Android 6.0說明
Android 6.0系統(tǒng)在原有的AndroidManifest.xml聲明權(quán)限的基礎(chǔ)上新增了運行時權(quán)限動態(tài)檢測,定位等權(quán)限也包含在其中。如果您的應(yīng)用程序設(shè)置了 targetSdkVersion ≥ 23,則需要在調(diào)用定位功能前進行權(quán)限檢查,權(quán)限檢查的示例代碼如下:
if (Build.VERSION.SDK_INT >= 23) {
String[] permissions = {
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
if (checkSelfPermission(permissions[0]) != PackageManager.PERMISSION_GRANTED)
{
requestPermissions(permissions, 0);
}
}
用戶選擇允許或拒絕后,會回調(diào)onRequestPermissionsResult方法:
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//可在此繼續(xù)其他操作。
}
常見問題
無法定位成功
- 首先請檢查您的程序編寫正確。可使用我們提供的 Demo 進行對比驗證。
- 請確保是在真機上運行程序。
- 請確保網(wǎng)絡(luò)連接可用,即3G或WiFi正常(不要求必須開啟GPS)??墒褂貌煌木W(wǎng)絡(luò)環(huán)境進行對比驗證。
- 請確定您的 Key 是否正確。
- 受限于基站和WiFi熱點分布范圍及更新速度,無法 100% 保證網(wǎng)絡(luò)定位成功。建議將設(shè)備移動到 500~800 米外重新測試。
如果仍然無法定位成功,請到 反饋建議 平臺中查看類似問題或直接提問,會有專人為您解答。
是否免費? 調(diào)用有次數(shù)限制嗎?
目前騰訊定位SDK完全免費,且沒有單日調(diào)用上限的限制。
什么是騰訊手機地圖定位SDK?
騰訊地圖定位SDK是一套基于Android 2.1及以上版本設(shè)備的應(yīng)用程序接口,通過該接口,您可以輕松的使用騰訊地圖定位服務(wù),構(gòu)建LBS應(yīng)用程序。
定位SDK包括GPS定位與網(wǎng)絡(luò)定位,實現(xiàn)了經(jīng)緯度坐標(biāo)偏轉(zhuǎn)與當(dāng)前位置的POI名稱、地址或者行政區(qū)劃的查詢。采用了移動緩存策略,節(jié)省流量與電量。