引言
定位功能初始化设置时耗时较多,如果放在Activity中操作,难免会有Activity切换较慢的问题。通过该工具类,可以实现一次初始化,多处随时调用。具有占用资源少,使用方便,便于复用,速度快,可根据不同需求获取不同结果的优点。
正文
1.高德地图基本配置:
1) 定位jar包;
2) Manifest配置。
2.定位工具类代码:
package com.frank.map;
import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import android.content.Context;
/**
*
* @ClassName: GDLocationUtil
* @Description: 高德地图定位工具类
* @author frank.fun@qq.com
* @date 2017年1月8日 下午1:51:47
*
*/
public class GDLocationUtil {
private static AMapLocationClient mlocationClient;
public static AMapLocationClientOption mLocationOption = null;
public static AMapLocation sLocation = null;
/**
*
* @Title: init
* @Description: 初始化地图导航,在Application onCreate中调用,只需调用一次
* @param context
*/
public static void init(Context context) {
// 声明mLocationOption对象
mlocationClient = new AMapLocationClient(context);
// 初始化定位参数
mLocationOption = new AMapLocationClientOption();
// 设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
// 设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
// 设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
}
/**
*
* @ClassName: MyLocationListener
* @Description: 定位结果回调
* @author frank.fun@qq.com
* @date 2017年1月8日 下午1:53:11
*
*/
public interface MyLocationListener {
public void result(AMapLocation location);
}
/**
*
* @Title: getLocation
* @Description: 获取位置,如果之前获取过定位结果,则不会重复获取
* @param listener
*/
public static void getLocation(MyLocationListener listener) {
if (sLocation == null) {
getCurrentLocation(listener);
} else {
listener.result(sLocation);
}
}
/**
*
* @Title: getCurrentLocation
* @Description: 获取位置,重新发起获取位置请求
* @param listener
*/
public static void getCurrentLocation(final MyLocationListener listener) {
if (mlocationClient==null) {
return;
}
// 设置定位监听
mlocationClient.setLocationListener(new AMapLocationListener() {
@Override
public void onLocationChanged(AMapLocation location) {
if (location != null) {
//定位成功,取消定位
mlocationClient.stopLocation();
sLocation=location;
listener.result(location);
}else {
//获取定位数据失败
}
}
});
// 启动定位
mlocationClient.startLocation();
}
/**
*
* @Title: destroy
* @Description: 销毁定位,必须在退出程序时调用,否则定位会发生异常
*/
public static void destroy() {
mlocationClient.onDestroy();
}
}
3.使用方法:
1) 在Application类的onCreate方法中进行初始化:
// 定位工具初始化
GDLocationUtil.init(this);
2) 在需要时调用:
// 获取之前定位位置,如果之前未曾定位,则重新定位
GDLocationUtil.getLocation(new MyLocationListener() {
@Override
public void result(AMapLocation location) {
//针对location进行相关操作,如location.getCity(),无需验证location是否为null;
}
});
// 获取当前位置,无论是否定位过,重新进行定位
GDLocationUtil.getCurrentLocation(new MyLocationListener() {
@Override
public void result(AMapLocation location) {
//针对location进行相关操作,如location.getCity(),无需验证location是否为null;
}
});
结束语
通常来说单独的定位功能是用于确定用户所在城市、位置,仅作显示并通过上传位置信息对用户提供相应周边服务用,因此无需重复定位。重复定位耗电量较多且大多无实际作用,因此此处只做单次定位的处理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。