android 高德地图移动卡顿_Android封装高德地图定位工具类

项目里要用到定位,通过定位获取到经纬度以及地址,想都没想,用高德,毕竟是阿里巴巴旗下的,支持国产。

高德官方地址:

https://lbs.amap.com/getting-started/locate

第一步  创建高德Key:

2213a59ab5cd299daf4add5b54185b56.png

53783814bb89bdaeb3ea695bbe118ac9.png

9ddd1adfca5e9ae9527a7841ae6fcd86.png

带*号的填完后,点击提交,获取SHA1值可以看我另一篇文章(通过代码获取的)或者通过命令行获取,两者都行。

Android studio代码获取SHA1值

https://mp.csdn.net/console/editor/html/108869249

190de7d3980d8b84997d810dfdaa6268.png

第二步  通过Gradle集成SDK(方便):

1、在Project的build.gradle文件中配置repositories,添加maven或jcenter仓库地址:

allprojects { repositories { jcenter() // 或者 mavenCentral() } }

2、在主工程的build.gradle文件配置dependencies

  定位     

   implementation 'com.amap.api:location:latest.integration'

第三步    配置参数

第 1 步,配置AndroidManifest.xml

请在application标签中声明service组件,每个app拥有自己单独的定位service。

!-- 定位需要的服务 使用2.0的定位需要加上这个 --service android:name=\"com.amap.api.location.APSService\" /service 

第2步,声明权限

!--用于进行网络定位--< >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 

第3步,设置高德Key:

meta-data android:name=\"com.amap.api.v2.apikey\" android:value=\"key\"/开发者申请的key       \n            \n>/meta-data//开发者申请的key

第四步   获取定位数据

在需要获取经纬度的页面调用如下代码,

 private AmapLocationUtil amapLocationUtil;
if (null == amapLocationUtil) {
amapLocationUtil = new AmapLocationUtil(MainActivity.this);
}
amapLocationUtil.initLocation();
amapLocationUtil.startLocation();
amapLocationUtil.setOnCallBackListener(new AmapLocationUtil.onCallBackListener() {
@Override
public void onCallBack(double longitude, double latitude, AMapLocation location, boolean isSucdess, String address) {
//isSucdess true 定位成功 false 失败
if(isSucdess){
//定位成功
Log.e("--->", "longitude" + longitude + "\n" + "latitude" + latitude + "\n" + "isSucdess" + isSucdess + "\n" + "address" + address);
Log.e("--->",location.getProvince()+ "\n" +location.getCity()+ "\n" +location.getDistrict());

}else{
//定位失败,重试定位
amapLocationUtil.startLocation();
}

}
});

注意:如果是在当前Activity实例化的,不要忘了销毁

@Override
protected void onDestroy() {
super.onDestroy();
amapLocationUtil.destroyLocation();
}

看到了代码里调用了AmapLocationUtil,这个是封装好的一个工具类,方便调用,代码如下:


import android.content.Context;
import android.util.Log;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
/**
*
* AmapLocationUtil
*/
public class AmapLocationUtil {
private Context mContext;
private AMapLocationClient locationClient = null;
private AMapLocationClientOption locationOption = null;
public static double longitude = 0;
public static double latitude = 0;
private onCallBackListener mOnCallBackListener = null;


public AmapLocationUtil(Context context) {
this.mContext = context;

}

/**
* 初始化定位
*/
public void initLocation() {
//初始化client
if (null == locationClient) {
locationClient = new AMapLocationClient(mContext);
}
locationOption = getDefaultOption();
//设置定位参数
locationClient.setLocationOption(locationOption);
// 设置定位监听
locationClient.setLocationListener(locationListener);

}


private AMapLocationClientOption getDefaultOption() {
AMapLocationClientOption mOption = new AMapLocationClientOption();
//如果网络可用就选择高精度
if (NetworkUtils.isConnected()) {
//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
mOption.setGpsFirst(true);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
}
//否则就选择仅设备模式
else {
mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);//可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
mOption.setGpsFirst(true);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
}
mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
mOption.setOnceLocation(false);//可选,设置是否单次定位。默认是false
mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,会自动变为单次定位,持续定位时不要使用
AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
mOption.setSensorEnable(true);//可选,设置是否使用传感器。默认是false
mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true
return mOption;
}

AMapLocationListener locationListener = new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
StringBuilder sb = new StringBuilder();
if (null != location) {
//errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
if (location.getErrorCode() == 0) {
longitude = location.getLongitude();
latitude = location.getLatitude();
String district = location.getDistrict();
locationSuccess(longitude, latitude, true, location, district);
//定位成功,停止定位:如果实时定位,就把stopLocation()关闭
stopLocation();
} else {

//定位失败
sb.append("定位失败" + "\n");
sb.append("错误码:" + location.getErrorCode() + "\n");
sb.append("错误信息:" + location.getErrorInfo() + "\n");
sb.append("错误描述:" + location.getLocationDetail() + "\n");
Log.e("---> 定位失败", sb.toString());
LocationFarile(false, location);

}
} else {
LocationFarile(false, location);

}
}
};

private void LocationFarile(boolean isSucdess, AMapLocation location) {
if (mOnCallBackListener != null) {
mOnCallBackListener.onCallBack(0, 0, location, false, "");
}
}

public void locationSuccess(double longitude, double latitude, boolean isSucdess, AMapLocation location, String address) {
if (mOnCallBackListener != null) {
mOnCallBackListener.onCallBack(longitude, latitude, location, true, address);
}
}

public void setOnCallBackListener(onCallBackListener listener) {
this.mOnCallBackListener = listener;
}

public interface onCallBackListener {
void onCallBack(double longitude, double latitude, AMapLocation location, boolean isSucdess, String address);
}
/**
* 开始定位
*/
public void startLocation() {
locationClient.startLocation();
}

/**
* 停止定位
*/
public void stopLocation() {
locationClient.stopLocation();
}

/**
* 销毁定位
*/
public void destroyLocation() {
if (null != locationClient) {
/**
* 如果AMapLocationClient是在当前Activity实例化的,
* 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
*/
locationClient.onDestroy();
locationClient = null;
locationOption = null;
}
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值