以前给大家写了一篇高德地图定位功能实现,今天给大家带来如何实现高德地图POI周边位置检索。
首先登陆高德地图API官网(https://lbs.amap.com/),点击右上角控制台:
点击右上角创建应用,名称和类型自己填写就好啦。
点击右上角的+号,为刚刚创建的项目添加key:
Key名称随便填写,看右边命名规范就好
PackageName就是项目的包名,打开你的Android Studio,看 build.gradle 中的applicationId或者AndroidManifest.xml中的package(其这俩一样)
下面主要说一下获取SHA1
打开Android Studio,点击gradle,选择app -> Tasks -> android -> signingReport,执行,在底部Run就可以拿到调试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
打开项目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配置完成了。
从高德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文件:
好了,文章到这里结束了,如果感觉对刚学习android 的你有所帮助别忘了点个赞加转发哦!