手把手接入高德地图API——POI周边搜索功能实现

以前给大家写了一篇高德地图定位功能实现,今天给大家带来如何实现高德地图POI周边位置检索。


配置高德地图API

首先登陆高德地图API官网(https://lbs.amap.com/),点击右上角控制台:

手把手接入高德地图API——POI周边搜索功能实现_第1张图片

点击右上角创建应用,名称和类型自己填写就好啦。

点击右上角的+号,为刚刚创建的项目添加key:

手把手接入高德地图API——POI周边搜索功能实现_第2张图片

Key名称随便填写,看右边命名规范就好

PackageName就是项目的包名,打开你的Android Studio,看 build.gradle 中的applicationId或者AndroidManifest.xml中的package(其这俩一样)

下面主要说一下获取SHA1

调试(debug)SHA1获取:

打开Android Studio,点击gradle,选择app -> Tasks -> android -> signingReport,执行,在底部Run就可以拿到调试SHA1

手把手接入高德地图API——POI周边搜索功能实现_第3张图片手把手接入高德地图API——POI周边搜索功能实现_第4张图片

发布版(release) SHA1获取:

release版SHA1需要一个release版本的签名文件(.jks)这个网上有很多生成签名文件的文章,大家可以去搜一下,这个不是我们的重点。本人比较懒,一般直接用AndroidStudio的ide生成:

打开Android studio: 点击顶部build -> Generate sign bundle/apk,进入如下界面:

手把手接入高德地图API——POI周边搜索功能实现_第5张图片

点击next,点击CREATE NEW,如果你之前没有创建过,你的所有文本应该都为空。

手把手接入高德地图API——POI周边搜索功能实现_第6张图片手把手接入高德地图API——POI周边搜索功能实现_第7张图片

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(如下):

手把手接入高德地图API——POI周边搜索功能实现_第8张图片


现在高德project配置已经完成了,接下来需要配置Android Studio project

配置Android Studio

打开项目AndroidManifest.xml,在application下添加:

 




声明meda-data和高德的Service

然后添加权限(从官网copy的)





















接入依赖:

在根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,效果如下:

手把手接入高德地图API——POI周边搜索功能实现_第9张图片

一个问题需要注意

如果有小伙伴发现自己请求location正常,但是请求poi返回错误码1901,我猜你可能也是Android 9.0做的测试机,android9.0对不安全的http协议默认禁止,所以我们需要在AndroidManifest中配置允许请求http协议:

android:networkSecurityConfig="@xml/network_security_config"

然后在res/xml目录下创建network_security_config.xml文件:



    

好了,文章到这里结束了,如果感觉对刚学习android 的你有所帮助别忘了点个赞加转发哦!

你可能感兴趣的:(Android基础)