手把手接入高德地圖API——POI周邊搜索功能實現

以前給大家寫了一篇高德地圖定位功能實現,今天給大家帶來如何實現高德地圖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 的你有所幫助別忘了點個贊加轉發哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章