百度sdk实现仿美团、饿了么选择收货地址,带搜索及poi检索列表

    • 首先去百度开放平台申请应用AK,然后放入自己的项目中。
    • 导入百度sdk的引用资源
    • 配置定位及检索需要的权限
    • 在自定义application初始化
    • 直接代码实现
    • 设置编辑框搜索SuggestionSearch
    • 整个功能差不多已经完结,可以完成搜索、滑动地图检索poi
  • Demo链接

首先去百度开放平台申请应用AK,然后放入自己的项目中。

            android:name="com.baidu.lbsapi.API_KEY"android:value="kGaoZOpl7hCvKqsN3xpz432Zfzyqtxlp" />

导入百度sdk的引用资源


具体资源可以从demo里面下载

配置定位及检索需要的权限

         <uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /><serviceandroid:name="com.baidu.location.f"android:enabled="true"android:process=":remote" />

在自定义application初始化

 SDKInitializer.initialize(this)SDKInitializer.setCoordType(CoordType.BD09LL)

直接代码实现

  1. 动态获取定位需要的权限,开始定位
  mLocationClient = LocationClient(applicationContext)mLocationClient!!.registerLocationListener(MyLocationListener())val option = LocationClientOption()option.locationMode = LocationClientOption.LocationMode.Hight_Accuracyoption.setIsNeedAddress(true)option.setIsNeedLocationPoiList(true)option.isOpenGps = truemLocationClient!!.locOption = option
实现定位监听,并初始化地图显示出界面
 private inner class MyLocationListener : BDLocationListener {override fun onReceiveLocation(location: BDLocation) {//获取定位结果if (!TextUtils.isEmpty(location.city)) {mLatLng = LatLng(location.latitude, location.longitude)initData(location.latitude, location.longitude)mSelectCity = location.cityif (mSelectCity.endsWith("市")) {mSelectCity = mSelectCity.substring(0, mSelectCity.length - 1)}tv_city.text=location.citymLocationClient!!.stop()} else {doLocation()mLocationClient!!.start()}}}
  1. 初始化地图并监听手指滑动回调
     //第一次定位,默认要用MapUtil.gcj02_To_Bd09()转换经纬度private fun initData(latitude: Double, longitude: Double, isSearch: Boolean? = false) {mBaiduMap = mapView.mapval location = MapUtil.gcj02_To_Bd09(latitude,longitude)mCenter = LatLng(latitude, longitude)val centerPoint =if (isSearch!!) LatLng(latitude, longitude) else LatLng(location[0], location[1])val mapStatus = MapStatus.Builder().apply {target(centerPoint)zoom(19f)}val mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus.build())
//        val mMapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(mCenter, 18f)mBaiduMap!!.setMapStatus(mMapStatusUpdate)mBaiduMap!!.setOnMapLoadedCallback {reverseRequest(mCenter)}mBaiduMap!!.setOnMapStatusChangeListener(object : BaiduMap.OnMapStatusChangeListener {override fun onMapStatusChangeStart(p0: MapStatus?) {}override fun onMapStatusChangeStart(p0: MapStatus?, p1: Int) {}override fun onMapStatusChange(p0: MapStatus?) {}override fun onMapStatusChangeFinish(mapStatus: MapStatus?) {val newCenter: LatLng = mapStatus!!.target// 如果是点击poi item导致的地图状态更新,则不用做后面的逆地理请求,if (mStatusChangeByItemClick) {if (!Utils.isLatlngEqual(mCenter, newCenter)) {mCenter = newCenter}mStatusChangeByItemClick = falsereturn}if (mCenter != null) {if (!Utils.isLatlngEqual(mCenter, newCenter)) {mCenter = newCenterreverseRequest(mCenter)}} else {mCenter = newCenterreverseRequest(mCenter)}}})}

3.逆地理编码请求,同时获取中心点位置附近poi列表

 /*** 逆地理编码请求** @param latLng*/private fun reverseRequest(latLng: LatLng?) {if (null == latLng) {return}setMarker()val reverseGeoCodeOption = ReverseGeoCodeOption().location(latLng).newVersion(1) // 建议请求新版数据.radius(sDefaultRGCRadius)if (null == mGeoCoder) {mGeoCoder = GeoCoder.newInstance()}mGeoCoder!!.setOnGetGeoCodeResultListener(object : OnGetGeoCoderResultListener {override fun onGetGeoCodeResult(p0: GeoCodeResult?) {}override fun onGetReverseGeoCodeResult(reverseGeoCodeResult: ReverseGeoCodeResult?) {val curAddressPoiInfo = PoiInfo()curAddressPoiInfo.address = reverseGeoCodeResult!!.addresscurAddressPoiInfo.location = reverseGeoCodeResult!!.location//经纬度转化地址val poiInfos = reverseGeoCodeResult!!.poiListpoiBeans.clear()var poiAddressBean: PoiAddressBeanif (poiInfos != null && !"".equals(poiInfos)) {for (poi in poiInfos) {poiAddressBean = PoiAddressBean()poiAddressBean.address = poi.addresspoiAddressBean.name = poi.namepoiAddressBean.location = poi.locationpoiBeans.add(poiAddressBean)Log.i("zyy",poi.toString())}}poiAdapter!!.notifyDataSetChanged()}})mGeoCoder!!.reverseGeoCode(reverseGeoCodeOption)}
  1. 设置marker
private fun setMarker() {val projection: Projection = mBaiduMap!!.projection ?: return//定义Maker坐标点val point = projection.toScreenLocation(mCenter)//构建Marker图标val bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_address)/* 构建MarkerOption,用于在地图上添加Marker */val option = MarkerOptions().position(mCenter).icon(bitmap).flat(false).fixedScreenPosition(point)//在地图上添加Marker,并显示mBaiduMap!!.addOverlay(option)bitmap.recycle()}

设置编辑框搜索SuggestionSearch

 private fun initSuggestions() {mSuggestionSearch = SuggestionSearch.newInstance()mSuggestionSearch.setOnGetSuggestionResultListener(object : OnGetSuggestionResultListener {override fun onGetSuggestionResult(suggestionResult: SuggestionResult?) {if (suggestionResult?.allSuggestions == null) {return}mSuggestionInfos.clear();//清空数据列表val suggestionInfoList = suggestionResult.allSuggestionsif (suggestionInfoList != null) {for (info in suggestionInfoList) {if (info.pt != null) {//过滤没有经纬度信息的mSuggestionInfos.add(info)}}}sugAdapter!!.notifyDataSetChanged();}})}
监听文本框搜索
et_search.addTextChangedListener(object : TextWatcher {override fun afterTextChanged(s: Editable?) {}override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {if (s!!.isEmpty()) {rcv_search.visibility = View.GONEreturn}rcv_search.visibility = View.VISIBLEmSuggestionSearch.requestSuggestion((SuggestionSearchOption()).citylimit(true).keyword(s.toString()).city(mSelectCity));}})

整个功能差不多已经完结,可以完成搜索、滑动地图检索poi

 //底部poi检索adapterprivate fun initAdapter() {poiAdapter = SearchPoiAdapter(poiBeans)rcv_nearby.layoutManager = LinearLayoutManager(this)rcv_nearby.adapter = poiAdapterpoiAdapter!!.setOnItemClickListener { adapter, view, position ->val bean = poiBeans[position]poiAdapter!!.updateStatus(bean.name)makeText(this, bean.address, LENGTH_SHORT).show()}}
 //关键字列表private fun initSearchAdapter() {sugAdapter = MapSearchAdapter(mSuggestionInfos)rcv_search.layoutManager = LinearLayoutManager(this)rcv_search.adapter = sugAdaptersugAdapter!!.setOnItemClickListener { adapter, view, position ->val info = mSuggestionInfos[position]initData(info.pt!!.latitude, info.pt!!.longitude, true)et_search.setText("")hideSoftInput(et_search)rcv_search.visibility = View.GONE}}

Demo链接

安卓仿美团、饿了么实现选择地址搜索检索相关推荐

  1. uniapp 仿美团饿了么城市列表+顶部搜索

    直接上图片 效果图如下 <template><view class="introScroll"><view class="topView&q ...

  2. 视频教程-Web前端开发仿美团/饿了吗移动App之高德地图接口对接案例-JavaScript

    Web前端开发仿美团/饿了吗移动App之高德地图接口对接案例 互联网编程行业10年开发和授课经验 曾任太极集团,外资企业等一线互联网python高级开发工程师 现任聚焦计算机技术有限公司项目组担任架构 ...

  3. 微信小程序—仿美团酒店入住日期时段选择

    美团市值突飞猛进,确实霸占了我们的吃喝玩乐,所以想做什么东西,研究一下美团也是不错的.最近需要用到一个酒店入住日期选择的组件,看了一下美团的设计,很好用,在此实现一下. 效果图如下: 体验路径(并获取 ...

  4. 仿美团饿了么选菜界面实现

    本文是在未来大神zxt头像狂魔的基础上稍作修改,大家在看这个博客之前可以出门右拐至这里: 传送门-----> 点击打开链接 好了,我们首先看一下两个app的界面长什么样子: 我们看到两个界面都很 ...

  5. 安卓仿美团开发实训课程

    系列文章目录 课程设计开发的是一款网上订餐的应用,该项目与我们平常看到的外卖界面比较类似,展示的内容包括店铺.菜单.购物车.订单与支付等信息. 文章目录 系列文章目录 前言 一.效果展示 二.项目结构 ...

  6. 自定义的仿美团,飞猪日期选择控件一

    本文是参考了网上找到的相应的文章和项目,自己动手实践的记录. 本文的主要目的是:1.复习一下自定义的view 2.利用Androidstudio4.0.2开发对比一下与之前有什么区别,因为在创建新项目 ...

  7. vue仿美团饿了么--底部导航公共组件

    底部导航栏,是每一个页面都需要用的,所以用的公共组件,在app.vue中引入 import common from "./components/footer/common.vue" ...

  8. vue仿美团饿了么,实现购物车功能

    未点击前,结算按钮未灰色,不能点击状态, 点击加号后,实现购物车图表高亮,结算按钮高亮,价格计算,弹出减号按钮. 先说点击的功能,点击加号加1,data中定义变量tot.给按钮绑定事件addShop事 ...

  9. vue仿美团饿了么,弹窗提示登录

    vue实现点击商店购物,没有登录时,提示登录. 在router.js定义好哪些页面需要登录才能进行 {path: '/shop/order',name: 'order',component: orde ...

最新文章

  1. silverlight之How To:设置ComboBox控件的数据源当ComboBox用来作为DataGrid的某列的编辑控件时...
  2. 如何在.NET中创建服务型组件
  3. ES6中的rest参数
  4. AndoridSQLite数据库开发基础教程(6)
  5. linux+取消磁盘阵列,Linux下彻底关闭某个RAID磁盘阵列
  6. 201621123068 Week04-面向对象设计与继承
  7. MAC设置——企业邮箱标准版
  8. [蓝桥杯][2013年第四届真题]带分数
  9. 比较TFS与SVN,你必须知道的10点区别
  10. C++编译时多态和运行时多态
  11. php中对象传值方式,php实现对象传值方式的具体案例
  12. 【BZOJ3489】A simple rmq problem(树套树)
  13. 分布式服务框架-原理与实践:15---服务降级-学习笔记
  14. 2021-09-30光纤组会
  15. C#学习笔记-WPF框架(MvvmLight)
  16. springcloud Netflix
  17. 网易云音乐——Web学习day6
  18. AVFoundation(一)
  19. C# wpf 封装成dll供C++调用
  20. 新装的linux设置root密码

热门文章

  1. 网络营销推广怎么做太极营销系列道法自然篇
  2. [浪子学编程][读书笔记]-道法自然之用例分析
  3. CRM销售管理的三个步骤
  4. 大学计算机结课报告怎么写,大学课程总结范文
  5. 嵌入式linux 交叉编译,嵌入式Linux实战篇--交叉编译环境的建立
  6. □ 影片名:《星河战队II 》(2026)
  7. 再见RestTemplate,Spring 6.1新特性:R
  8. iOS项目实践之时光电影(一)
  9. cacti安装与配置
  10. 心田花开:影响孩子注意力的原因大揭秘!