LocationUtils.java 10.3 KB

package com.wd.location;

import android.content.Context;
import android.text.TextUtils;
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.apis.utils.core.api.AMapUtilCoreApi;
import com.wd.base.log.Logger;
import com.wd.foundation.wdkit.utils.SpUtils;
import com.wd.foundation.wdkitcore.tools.AppContext;

/**
 * 定位
 * @author lvjinhui
 */

public class LocationUtils {

    private AMapLocationClient locationClient = null;
    private AMapLocationClientOption locationOption = null;

    public LocationUtils() {
        initLocation(AppContext.getContext().getApplicationContext());
    }

    private void initLocation(Context context) {
        /**
         * 基础库设置是否允许采集个人及设备信息
         * @param collectEnable: true 允许采集 false 不允许采集
         */
        AMapUtilCoreApi.setCollectInfoEnable(false);
        //初始化client
        try {
            AMapLocationClient.updatePrivacyShow(context,true,true);
            AMapLocationClient.updatePrivacyAgree(context,true);
            locationClient = new AMapLocationClient(context);
            locationOption = getDefaultOption();
            if (null != locationClient) {
                //设置定位参数
                locationClient.setLocationOption(locationOption);
                // 设置定位监听
                locationClient.setLocationListener(locationListener);

            }

        }catch (Exception e){
            e.printStackTrace();
        }

    }

    /**
     * 默认的定位参数
     *
     * @author hongming.wang
     * @since 2.8.0
     */
    private AMapLocationClientOption getDefaultOption() {
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        //低功耗模式
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
        //可选,设置定位模式,可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(false);//可选,设置是否gps优先,只在高精度模式下有效。默认关闭
        mOption.setHttpTimeOut(30000);//可选,设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setInterval(2000);//可选,设置定位间隔。默认为2秒
        mOption.setNeedAddress(true);//可选,设置是否返回逆地理地址信息。默认是true
        mOption.setOnceLocation(true);//可选,设置是否单次定位。默认是false
        mOption.setOnceLocationLatest(false);//可选,设置是否等待wifi刷新,默认为false.如果设置为true,
        // 会自动变为单次定位,持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选, 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        mOption.setSensorEnable(false);//可选,设置是否使用传感器。默认是false
        mOption.setWifiScan(true); //可选,设置是否开启wifi扫描。默认为true,如果设置为false
        // 会同时停止主动刷新,停止以后完全依赖于系统刷新,定位位置可能存在误差
        mOption.setLocationCacheEnable(true); //可选,设置是否使用缓存定位,默认为true
        mOption.setGeoLanguage(AMapLocationClientOption.GeoLanguage.DEFAULT);
        //可选,设置逆地理信息的语言,默认值为默认语言(根据所在地区选择语言)
        return mOption;
    }
    /**
     * 定位监听
     */
    AMapLocationListener locationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation location) {
            if (null != location) {
                //errCode等于0代表定位成功,其他的为定位失败,具体的可以参照官网定位错误码说明
                if (location.getErrorCode() == 0) {
                    if (locationSuccessListener != null){
                        locationSuccessListener.onLocationSuccess(location);
                    }
                    //定位成功首次请求
                    int firstLocation = SpUtils.getFirstLocation();
                    if (2 != firstLocation ){
                        SpUtils.saveFirstLocation(1);
                    }

                    if(!TextUtils.isEmpty(location.getProvince())){
                        //省发生变化,传递1
                        String localProvinceName = SpUtils.getUserLocalProviceName();
                        if (!location.getProvince().equals(localProvinceName)){
                            SpUtils.saveFirstLocation(1);
                        }
                        SpUtils.saveUserLocalProviceName(location.getProvince());
                    }

                    if (!TextUtils.isEmpty(location.getCity())){
                        //保存城市
                        //SpUtils.saveQtCity(location.getProvince() +"·"+ location.getCity()+"·"+ location.getDistrict());
                        SpUtils.saveCity(location.getCity() );
                    }
                    if(!TextUtils.isEmpty(location.getAdCode())){
                        //保存区、县code
                        SpUtils.saveDistrictCode(location.getAdCode());
                    }
                    //保存经度、纬度、地址
                    SpUtils.saveLongitude(location.getLongitude()+"");
                    SpUtils.saveLatitude(location.getLatitude()+"");
                    SpUtils.saveAddress(location.getAddress());
                    if(BuildConfig.DEBUG) {
                        StringBuffer sb = new StringBuffer();
                        sb.append("定位成功" + "\n");
                        sb.append("经    度    : " + location.getLongitude() + "\n");
                        sb.append("纬    度    : " + location.getLatitude() + "\n");
                        sb.append("地    址    : " + location.getAddress() + "\n");
                        sb.append("****************").append("\n");
                        Logger.t(LocationUtils.class.getSimpleName()).d("---------->"+sb.toString());
                    }
                } else {
                    if (locationSuccessListener != null){
                        locationSuccessListener.onLocationFail(location);
                    }
                    if(BuildConfig.DEBUG) {
                        StringBuffer sb = new StringBuffer();
                        //定位失败
                        sb.append("定位失败" + "\n");
                        sb.append("错误码:" + location.getErrorCode() + "\n");
                        sb.append("错误信息:" + location.getErrorInfo() + "\n");
                        sb.append("错误描述:" + location.getLocationDetail() + "\n");
                        sb.append("****************").append("\n");
                        Logger.t(LocationUtils.class.getSimpleName()).d("---------->"+sb.toString());

                    }
                }
                //停止定位,正常定位一次,需要重新定位的调用relocation
                stopLocation();
            } else {
                if (locationSuccessListener != null){
                    locationSuccessListener.onLocationFail(location);
                }
                //tv_location.setText("定位失败,loc is null");
                stopLocation();
            }
        }
    };

    // 根据控件的选择,重新设置定位参数
    private void resetOption() {
        // 设置是否需要显示地址信息
        locationOption.setNeedAddress(true);
        /**
         * 设置是否优先返回GPS定位结果,如果30秒内GPS没有返回定位结果则进行网络定位
         * 注意:只有在高精度模式下的单次定位有效,其他方式无效
         */
        locationOption.setGpsFirst(false);//需要快速定位,不要等GPS
        // 设置是否开启缓存
        locationOption.setLocationCacheEnable(false);
        // 设置是否单次定位
        locationOption.setOnceLocation(true);
        //设置是否等待设备wifi刷新,如果设置为true,会自动变为单次定位,持续定位时不要使用
        locationOption.setOnceLocationLatest(true);
        //设置是否使用传感器
        locationOption.setSensorEnable(false);
        locationOption.setInterval(Long.valueOf(3000));
        locationOption.setHttpTimeOut(10000);
    }

    /**
     * 开始定位
     *
     */
    public void startLocation() {
        //根据控件的选择,重新设置定位参数
        resetOption();
        if (null != locationClient) {
            // 设置定位参数
            locationClient.setLocationOption(locationOption);
            // 启动定位
            locationClient.startLocation();
        }

    }

    /**
     * 停止定位
     *
     */
    private void stopLocation() {
        if (null != locationClient) {
            // 停止定位
            locationClient.stopLocation();
        }

    }

    /**
     * 销毁定位
     *
     * @author hongming.wang
     * @since 2.8.0
     */
    public void destroyLocation() {
        if (null != locationClient) {
            /**
             * 如果AMapLocationClient是在当前Activity实例化的,
             * 在Activity的onDestroy中一定要执行AMapLocationClient的onDestroy
             */
            locationClient.onDestroy();
            locationClient = null;


        }
        if (null != locationClient) {
            locationListener   = null;
        }
        if (null != locationOption) {
            locationOption   = null;
        }

        if (locationSuccessListener != null){
            locationSuccessListener = null;
        }
    }


    /**
     * 设置接口,获取定位
     */
    private  OnLocationSuccessListener locationSuccessListener;

    public interface OnLocationSuccessListener {
        /**
         * 定位成功
         * @param aMapLocation
         */
        void onLocationSuccess(AMapLocation aMapLocation);

        /**
         * 定位失败
         */
        default void onLocationFail(AMapLocation aMapLocation){};
    }

    public void setOnLocationSuccessListener(OnLocationSuccessListener locationSuccessListener){
        this.locationSuccessListener = locationSuccessListener;
    }
}