高德地图定位工具类

太阳碎片

太阳碎片

发表于 2017-01-09 12:40:30

引言

定位功能初始化设置时耗时较多,如果放在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 [email protected] 
 * @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 [email protected] 
 * @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;
            }
        });

结束语

通常来说单独的定位功能是用于确定用户所在城市、位置,仅作显示并通过上传位置信息对用户提供相应周边服务用,因此无需重复定位。重复定位耗电量较多且大多无实际作用,因此此处只做单次定位的处理。

内容来源:https://segmentfault.com/a/1190000008048506

用户评论
开源开发学习小组列表