双重锁封装定位

//定位工具类
public  class LocationUtil {
    //声明mlocationClient对象
    public static LocationUtil mLocationUtil;
    public   AMapLocationClient  mlocationClient;
    Context  mContext;
    LocationLister mLocationLister;
    private LocationUtil(Context mContext){
       this. mContext = mContext;
    }
       //定位监听接口
    public interface   LocationLister {
         void OnLocationComplete();
         void OnLocationError(int errorCode , String errorMessage);
    }

    public void  setOnLocationLister( LocationLister mLocationLister){
        this.mLocationLister = mLocationLister;

    }
    public static LocationUtil  initLoaction(Context mContext){

        if (mLocationUtil == null){
            synchronized (LocationUtil.class){
                if(mLocationUtil == null ){
                    mLocationUtil=   new   LocationUtil(mContext);
                }
            }
        }
        return mLocationUtil;
    }
    //开始定位
    public void  startLocation(){
         mlocationClient = new AMapLocationClient(mContext);
        //设置定位监听
        mlocationClient.setLocationListener(locationListener);
        //设置定位参数
        mlocationClient.setLocationOption(mClientOption());
        // 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
        // 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求
        // 在定位结束后,在合适的生命周期调用onDestroy()方法
        // 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
        //启动定位
        mlocationClient.startLocation();
        DLOG.e("Location-----startLocation");
    }

    //设置定位参数
    private AMapLocationClientOption  mClientOption(){
        //初始化定位参数
        AMapLocationClientOption  mLocationOption = new AMapLocationClientOption();
        //设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
                mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
        //设置定位间隔,单位毫秒,默认为2000ms
        mLocationOption.setInterval(2000);
        return  mLocationOption;
    }


    //定位监听
    AMapLocationListener  locationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            DLOG.e("Location-----amapLocation"+"" + aMapLocation.getLatitude()+"======" + aMapLocation.getLongitude());
            if (aMapLocation != null) {

                if (aMapLocation.getErrorCode() == 0) {
                    //定位成功回调信息,设置相关消息
                    double  latitude =    aMapLocation.getLatitude();//获取纬度
                    double  longitude =  aMapLocation.getLongitude();//获取经度
                    DLOG.e("Location-----OnLocationLister"+"" + latitude+"======" + longitude);
                    mLocationLister.OnLocationComplete();
                } else {
                    mLocationLister. OnLocationError(aMapLocation.getErrorCode(),aMapLocation.getErrorInfo().toString());
                    //显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
                }
            }
        }
    };



    //结束定位
    public void  destoryLocation(){
        DLOG.e("Location-----onDestroy -- "+mlocationClient);
        if(mlocationClient!=null){
            DLOG.e("Location-----onDestroy");
            mlocationClient.onDestroy();
        }

    }

}

activity 使用

//开启定位
LocationUtil.initLoaction(GameVideoApplication.instance).startLocation();

//监听定位

LocationUtil.initLoaction(Application.instance).setOnLocationLister(new LocationUtil.LocationLister() {
    @Override
    public void OnLocationComplete() {
        //获取到经纬度   停止定位
        DLOG.e("Location-----OnLocationLister"+"destoryLocation"  );
        LocationUtil.initLoaction(Application.instance).destoryLocation();
    }

    @Override
    public void OnLocationError(int errorCode, String errorMessage) {
        DLOG.e("Location-----errorCode"+errorCode+" "+errorMessage  );
        //获取到经纬度失败   停止定位
        LocationUtil.initLoaction(Application.instance).destoryLocation();
    }
});

猜你喜欢

转载自blog.csdn.net/cao2884388/article/details/120218186