AMapLocationListener 高德地图定位监听

app内很多地方需要用到定位信息,我就自己封装了一个基于高德地图定位监听的类,以便于获取定位权限,和方便调用定位监听事件。我这边继承了LifecycleObserver,将定位事件和acticity的生命周期绑定在了一起,这样的话即便一开始定位没开或者获取定位失败了,还能在后面继续获取定位信息。

AMapLocationListener

package cn.sunsapp.owner.util;import android.content.Context;import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver;
import androidx.lifecycle.OnLifecycleEvent;import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.maps.model.LatLng;
import com.basic.lattercore.app.Suns;
import com.basic.lattercore.util.permission.PermissionSetting;
import com.yanzhenjie.permission.Action;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;import java.util.List;public class AMapLocationListener implements LifecycleObserver {private Context mContext;public AMapLocationListener(Context context) {this.mContext = context;}private AMapLocationClient locationClient;//声明mLocationOption对象private AMapLocationClientOption locationOption = null;private LatLng myLatlng;private LocationListener listener;public void setListener(LocationListener listener) {this.listener = listener;}public LatLng getMyLatlng() {return myLatlng;}private void setMyLatlng(LatLng myLatlng) {this.myLatlng = myLatlng;}@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)void createLocation(){initLocation();startLocation();}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)void destroyLocal(){destroyLocation();}private void initLocation() {//初始化clientlocationClient = new AMapLocationClient(Suns.getApplication());locationOption = getDefaultOption();//设置定位参数locationClient.setLocationOption(locationOption);// 设置定位监听locationClient.setLocationListener(locationListener);}/*** 默认的定位参数*/private AMapLocationClientOption getDefaultOption() {AMapLocationClientOption mOption = new AMapLocationClientOption();mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式mOption.setGpsFirst(true);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效mOption.setInterval(5 * 1000);//可选,设置定位间隔。默认为2秒mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是truemOption.setOnceLocation(false);//可选,设置是否单次定位。默认是falsemOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTPmOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是falsemOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true//mOption.setGeoLanguage(AMapLocationClientOption.GeoLanguage.DEFAULT);//可选,设置逆地理信息的语言,默认值为默认语言(根据所在地区选择语言)return mOption;}/*** 定位监听*/com.amap.api.location.AMapLocationListener locationListener = new com.amap.api.location.AMapLocationListener() {@Overridepublic void onLocationChanged(AMapLocation location) {if (null != location) {StringBuffer sb = new StringBuffer();//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明if (location.getErrorCode() == 0) {double lat = location.getLatitude();double lon = location.getLongitude();myLatlng = new LatLng(lat,lon);setMyLatlng(myLatlng);if (listener != null) {listener.success(location);// 如果需要一直获取定位监听权限的话,就把下面这一行注释掉locationClient.stopLocation();}} else {//定位失败sb.append("定位失败" + "\n");sb.append("错误码:" + location.getErrorCode() + "\n");sb.append("错误信息:" + location.getErrorInfo() + "\n");sb.append("错误描述:" + location.getLocationDetail() + "\n");listener.error();}}}};private void startLocation() {AndPermission.with(mContext).runtime().permission(Permission.ACCESS_COARSE_LOCATION).onGranted(new Action<List<String>>() {@Overridepublic void onAction(List<String> data) {// 启动定位locationClient.startLocation();}}).onDenied(new Action<List<String>>() {@Overridepublic void onAction(List<String> data) {// 获取定位权限弹窗,如果需要每次打开都提示获取定位权限的话,就把下面的判断条件注视打开
//                if (AndPermission.hasAlwaysDeniedPermission(mContext, data) ) {new PermissionSetting(mContext).showSetting(data);
//                }}}).start();}/*** 销毁定位** @author hongming.wang* @since 2.8.0*/private void destroyLocation() {if (null != locationClient) {/*** 如果AMapLocationClient是在当前Activity实例化的,* 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy*///locationClient.disableBackgroundLocation(true);locationClient.stopLocation();locationClient.unRegisterLocationListener(locationListener);locationClient.onDestroy();locationClient = null;locationOption = null;}}public interface LocationListener{void success(AMapLocation mapLocation);void error();}/*** 回到自己的定位*/
//    public void moveTolocation(AMap aMap) {//        if (aMap != null && myLatlng != null) {//            //将地图移动到定位点
//            aMap.moveCamera(CameraUpdateFactory.changeLatLng(myLatlng));
//        }
//    }}

PermissionSetting

package com.basic.lattercore.util.permission;import android.content.Context;
import android.text.TextUtils;import com.basic.core.R;
import com.lxj.xpopup.XPopup;
import com.lxj.xpopup.interfaces.OnConfirmListener;
import com.lxj.xpopup.interfaces.OnInputConfirmListener;
import com.yanzhenjie.permission.AndPermission;
import com.yanzhenjie.permission.runtime.Permission;import java.util.List;/*** 用来处理权限一直被拒绝,弹出弹窗让用户去设置界面开启此权限*/
public class PermissionSetting {private static final int REQ_CODE_PERMISSION = 1;private final Context mContext;public PermissionSetting(Context context) {this.mContext = context;}public void showSetting(final List<String> permissions) {List<String> permissionNames = Permission.transformText(mContext, permissions);String message = "我们需要以下权限,请在设置中为我们开启:"+ "\n"+ permissionNames;new XPopup.Builder(mContext).asConfirm("提示", message,new OnConfirmListener() {@Overridepublic void onConfirm() {AndPermission.with(mContext).runtime().setting().start(REQ_CODE_PERMISSION);}}).bindLayout(R.layout.my_confim_popup).show();}}

使用示例(在主页面HomeActivity调用AMapLocationListener)

/*** 在onCreate()调用即可*/
private void initLocation() {//添加定位监听AMapLocationListener aMapLocationListener = new AMapLocationListener(mContext);aMapLocationListener.setListener(new AMapLocationListener.LocationListener() {@Overridepublic void success(AMapLocation mapLocation) {// maplocation存放了很多的定位数据,经纬度省市县详细地址都可以从这里拿}@Overridepublic void error() {}});// 将定位监听事件和acitvity生命周期绑定在一起getLifecycle().addObserver(aMapLocationListener);}

小结

不同的app都有不同的需求,在AMapLocationClientOption 的getDefaultOption()方法里面设置您所需要的参数。
最后,有啥问题或者我写的有地方写错了希望您能在评论区留言,加个关注点个赞吧,求求您了!

AMapLocationListener 高德地图定位监听相关推荐

  1. 高德地图使用-监听地图缩放

    监听地图缩放事件 map.on('zoomchange', () => {var zoom = map.getZoom();console.log("缩放",zoom) }) ...

  2. Android——高德地图实现多点连线与点击定位监听实现

    最近开发的项目中需要使用到的功能,如下图所示: 服务器会传来一个包含项数据类型为坐标与时间的数组. 需要实现的功能有: 1.按时间顺序对每个点进行连线. 2.点击单个点会在点的上分dialog内显示时 ...

  3. android 定位工具类,高德地图定位工具类

    引言 定位功能初始化设置时耗时较多,如果放在Activity中操作,难免会有Activity切换较慢的问题.通过该工具类,可以实现一次初始化,多处随时调用.具有占用资源少,使用方便,便于复用,速度快, ...

  4. 高德地图定位的简单实现

    1.要实现高德地图的定位,首先要下载高德地图的SDK以及高德地图定位的SDK 下载地址:http://lbs.amap.com/api/android-sdk/download/ http://lbs ...

  5. 使用plugman开发cordova 高德地图定位插件

    在开发的过程中我们更多的是使用别人开发的cordova插件,但是在使用的过程中经常会遇到一些不合自己心意的问题,那么我们就来使用plugman开发一个属于自己的cordova插件吧. 源码地址 : h ...

  6. android 高德地图 lbstraceclient,安卓高德地图定位篇-(1)

    安卓高德地图定位.先看效果图: STEP1: 先去高德开放平台注册账号,这个不用多说吧 网址:https://lbs.amap.com/ 之后再去控制台-应用管理找到自己的key,如下图所示 STEP ...

  7. 高德地图定位、添加定位图标、连线(一)

    一.定位 若只要定位功能而不需要显示出地图,只需添加AMap_Location_V2.4.1_20160414.jar一个jar包即可: 1.AndroidMainfests.xml文件 1)添加服务 ...

  8. android中高德地图定位功能并且获取定位的城市

    一.概述 今天再一次用到了地图定位功能和地图显示功能,以前一直用的是高德地图定位,这次还是用高德,记录一下以便以后再做时方便一些.因为业务需要的功能不是很全,可以参考https://www.2cto. ...

  9. Android 高德地图定位和导航

    1. 在高德开放平台注册帐号 2.在高德地图开发平台中下载Android平台下载地图SDK和定位SDK和导航SDK文件 3. 添加jar包,将jar包放入工程的libs目录下. (下载的三合一的SDK ...

  10. 高德地图定位拖动改变位置

    现在关于地图使用越来越多,相信大家可能都或多或少的用到过,本篇文章简单总结了一下关于高德地图定位且可以拖动改变位置的功能的实现. 首先按照高德开发文档,导入jar包,申请key,可以在高德地图的开放平 ...

最新文章

  1. 免费技术直播:唐宇迪带你一节课了解机器学习经典算法
  2. Unity3D中暂停时的动画及粒子效果实现
  3. Unity应用架构设计(7)——IoC工厂理念先行
  4. Transformer总结(2022版)
  5. set和vector
  6. 利用 CocoaLumberjack 搭建自己的 Log 系统
  7. 知识表示与知识图谱--介绍
  8. 解决listview addheader EditText焦点问题
  9. 数据挖掘:模型状态评估
  10. 基于Python的《庆余年》评论分析
  11. 利用递归,反射,注解等,手写Spring Ioc和Di 底层(喷倒面试官
  12. 计算机mac网关,如何在Mac OS X中获取默认网关地址 | MOS86
  13. Error while executing: am start -n(更换包名)
  14. Kali报错SIOCSIFFLAGS:不允许的操作 解决办法
  15. 花-寒-进-13-A-丛林之路
  16. ROS2学习笔记22--使用launch启动/监听多个node节点
  17. Java学习记录——错题总结(十五)
  18. 如何用ffmpeg截取视频片段截取时间不准确的坑
  19. 基于微信小程序的RSS订阅器
  20. Easyui 搭建后台管理界面

热门文章

  1. 30套精选程序员个人简历模板.zip
  2. java面试笔试大全
  3. node.js 爬取腾讯地图API全国行政区数据
  4. 截止到2022年9月底可用的与大屏可视化相关的网站和网页
  5. python将音频转换成文字_用Python将音频内容转换为文本格式
  6. python json转字符串_python如何将json转成字符串
  7. java的帮助文档(API)
  8. ug安装教程详细步骤ug怎么免费安装教程ug软件怎样安装步骤
  9. spring - 源码下载与构建
  10. 计算机分区格式转换,硬盘GPT分区与MBR分区如何转换