以前給大家寫了一篇高德地圖定位功能實現,今天給大家帶來如何實現高德地圖POI周邊位置檢索。
配置高德地圖API
首先登陸高德地圖API官網(https://lbs.amap.com/),點擊右上角控制檯:
點擊右上角創建應用,名稱和類型自己填寫就好啦。
點擊右上角的+號,爲剛剛創建的項目添加key:
Key名稱隨便填寫,看右邊命名規範就好
PackageName就是項目的包名,打開你的Android Studio,看 build.gradle 中的applicationId或者AndroidManifest.xml中的package(其這倆一樣)
下面主要說一下獲取SHA1
調試(debug)SHA1獲取:
打開Android Studio,點擊gradle,選擇app -> Tasks -> android -> signingReport,執行,在底部Run就可以拿到調試SHA1
發佈版(release) SHA1獲取:
release版SHA1需要一個release版本的簽名文件(.jks)這個網上有很多生成簽名文件的文章,大家可以去搜一下,這個不是我們的重點。本人比較懶,一般直接用AndroidStudio的ide生成:
打開Android studio: 點擊頂部build -> Generate sign bundle/apk,進入如下界面:
點擊next,點擊CREATE NEW,如果你之前沒有創建過,你的所有文本應該都爲空。
key store path: 選擇生成jks文件的絕對路徑,我明明簽名文件爲haha.jks
password:jks文件的密碼
alias:選擇別名
password:別名密碼
下面的全都是問題,我一般都填1了。。。。
生成之後在你的路徑中就會有haha.jks簽名文件了。然後使用keytools命令打開簽名文件,找到我們需要的SHA1:
打開(Windows:命令行)(Mac:終端)(else:第三方命令行軟件),執行下列命令
cd jks文件的當前路徑
keytool -v -list -keystore haha.jks
之後輸入密碼(你自己設置的心理沒數嗎)
然後就出來我們要的release版本SHA1了。
現在拿到了debug和release的SHA1,填寫,提交。你應該會看到項目中有一個Key(如下):
現在高德project配置已經完成了,接下來需要配置Android Studio project
配置Android Studio
打開項目AndroidManifest.xml,在application下添加:
<meta-data android:name="com.amap.api.v2.apikey" android:value="你剛剛申請的Key,你自己心裏沒數嗎">
</meta-data>
<service android:name="com.amap.api.location.APSService"></service>
聲明meda-data和高德的Service
然後添加權限(從官網copy的)
<!--用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!--用於訪問GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!--獲取運營商信息,用於支持提供運營商信息相關的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!--用於訪問wifi網絡信息,wifi信息會用於進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!--這個權限用於獲取wifi的獲取權限,wifi信息會用來進行網絡定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!--用於訪問網絡,網絡定位需要上網-->
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<!--用於讀取手機當前的狀態-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!--寫入擴展存儲,向擴展卡寫入數據,用於寫入緩存定位數據-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!--用於申請調用A-GPS模塊-->
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
<!--用於申請獲取藍牙信息進行室內定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>
接入依賴:
在根build.gradle中添加如下配置:
allprojects { repositories { jcenter() // 或者 mavenCentral() } }
在項目build.gradle添加依賴:
SDK |
引入代碼 |
---|---|
3D地圖 |
compile 'com.amap.api:3dmap:latest.integration' |
2D地圖 |
compile 'com.amap.api:map2d:latest.integration' |
導航 |
compile 'com.amap.api:navi-3dmap:latest.integration' |
搜索 |
compile 'com.amap.api:search:latest.integration' |
定位 |
compile 'com.amap.api:location:latest.integration' |
我們要做Poi檢索,只需要定位和搜索就夠了,其他的不用接入:
api 'com.amap.api:location:4.0.0'
api 'com.amap.api:search:3.3.0'
ok,關於Android Studio配置完成了。
Poi實現
從高德API官網得知,Poi搜索需要先知道當前經緯度,所以我們需要先通過定位api獲取當前位置,然後調用poi檢索的Api。
lateinit var client: AMapLocationClient
client = AMapLocationClient(this)
client.setLocationListener(this)
client.setLocationOption(AMapLocationClientOption().apply {
locationMode = AMapLocationClientOption.AMapLocationMode.Hight_Accuracy//高精度定位模式
isOnceLocation = true//只定位一次,因爲就用一次定位獲取經緯度
})
client.startLocation() //啓動定位
在定位回調結果中,拿到經緯度。然後初始化PoiSearch類,並啓動Poi檢索:
lateinit var mQuery: PoiSearch.Query
lateinit var mPoiSearch: PoiSearch
override fun onLocationChanged(location: AMapLocation) {
mQuery = initQuery(location.cityCode) //初始化PoiQuery類
mPoiSearch = initPoiSearch(location.longitude, location.latitude) //初始化PoiSearch類
mPoiSearch.searchPOIAsyn() //啓動Poi檢索
}
//初始化PoiQuery類
private fun initQuery(cityCode: String?): PoiSearch.Query {
//第一個參數是周邊關鍵詞,第二個參數是Poi搜索類型(講道理我沒看懂,傳“”就行了),第三個參數是城市名字或者是城市編碼,城市編碼就在剛纔獲取定位location中就可以獲取到。
return PoiSearch.Query("", "", cityCode).apply {
pageSize = 10 //一次獲取10個周邊信息
pageNum = 1 //獲取第幾頁
}
}
//初始化PoiSearch類
private fun initPoiSearch(longitude: Double, latitude: Double): PoiSearch {
return PoiSearch(this, mQuery).apply {
setOnPoiSearchListener(this@MainActivity)
//SearchBound第一個參數都能看懂,是經緯度的包裝類,傳入經緯度中心店
//第二個參數是搜索半徑
bound = PoiSearch.SearchBound(LatLonPoint(longitude, latitude), 10000)
}
}
在回調onPoiSearched方法中獲取Poi數據:
override fun onPoiSearched(result: PoiResult?, rCode: Int) {
if (rCode == 1000) {//rCode 1000表示獲取成功
result!!.pois.forEach {//遍歷輸出獲取的poi結果
d("onPoiSearched ${result.pois.indexOf(it)} ${it.title}")
}
}
}
自己寫了個簡單demo,效果如下:
一個問題需要注意
如果有小夥伴發現自己請求location正常,但是請求poi返回錯誤碼1901,我猜你可能也是Android 9.0做的測試機,android9.0對不安全的http協議默認禁止,所以我們需要在AndroidManifest中配置允許請求http協議:
android:networkSecurityConfig="@xml/network_security_config"
然後在res/xml目錄下創建network_security_config.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
好了,文章到這裏結束了,如果感覺對剛學習android 的你有所幫助別忘了點個贊加轉發哦!