美文网首页程序员之家
如何快速切换定位服务商

如何快速切换定位服务商

作者: SeptemberWei | 来源:发表于2019-07-12 10:26 被阅读0次

    在我们的移动应用开发中多多少少都会使用到定位服务的场景,而现在主流的定位服务一般都使用百度或者高德来进行集成。那么就有个问题,如果需要切换我们的地位服务供应商怎么办。最近公司有个项目就遇到了这个问题,原本计划是使用高德来进行集成的,前期开发也是使用高德来做的定位,但现在需要切换到百度定位,那么就需要对原有的定位服务进行切换,在这里记录一下自己的实现方式,个人感觉这样还是比较方便的。

    首先定义一个用于发起定位的接口:ILocationProcess

    public interface ILocationProcess {
        void startLocation(ICallback callback);
    }
    

    在ILocationProcess接口中需要传入一个回调接口ICallback ,用于返回我们的定位数据。

    public interface ICallback {
        void onSuccess(Location location);
    }
    

    ICallback 回调接口中我们定义了一个onSuccess方法并传入了一个自定义的Location对象用于存放定位数据。当然我们也可以不使用自定义的对象来存储,而是直接使用百度或者高德返回的对象来进行操作,具体实现方式可以使用泛型来实现,这里就不举例子了(实现还是比较简单的)。

    当我们定义好了发起定位的接口以及回调接口以后我们可以来进行实现了,首先实现高德的定位服务。我们需要创建一个类来实现ILocationProcess接口:

    public class AMapLocationProcess implements ILocationProcess {
    
        private WeakReference<Context> mContext;
        private ICallback callback;
    
        public AMapLocationClient mLocationClient;
    
        public AMapLocationProcess(Context context) {
            mContext = new WeakReference<>(context);
            mLocationClient = new AMapLocationClient(mContext.get());
            mLocationClient.setLocationListener(aMapLocation -> {
                if (callback != null) {
                    callback.onSuccess(new Location(aMapLocation.getLatitude(), aMapLocation.getLongitude()));
                }
            });
            AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
            mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
           //....定位的相关配置,这里就不贴代码了
            if (null != mLocationClient) {
                mLocationClient.setLocationOption(mLocationOption);
            }
        }
    
        @Override
        public void startLocation(ICallback callback) {
            this.callback = callback;
            mLocationClient.stopLocation();
            mLocationClient.startLocation();
        }
    }
    

    下面是百度定位的实现:

    public class BaiduLocationProcess implements ILocationProcess {
    
        private LocationClient mLocationClient;
        private WeakReference<Context> mContext;
        private ICallback callback;
    
        public BaiduLocationProcess(Context context) {
            mContext = new WeakReference<>(context);
            mLocationClient = new LocationClient(mContext.get());
            mLocationClient.registerLocationListener(new BDAbstractLocationListener() {
                @Override
                public void onReceiveLocation(BDLocation bdLocation) {
                    if (callback != null) {
                        callback.onSuccess(new Location(bdLocation.getLatitude(), bdLocation.getLongitude()));
                    }
                }
            });
    
            LocationClientOption option = new LocationClientOption();
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            //....同上,定位的相关配置,这里就不贴代码了
            mLocationClient.setLocOption(option);
        }
    
        @Override
        public void startLocation(ICallback callback) {
            this.callback = callback;
            mLocationClient.start();
        }
    }
    

    当我们把高德以及百度的定位都实现了以后,我们就需要一个初始化的地方来切换不同的定位服务了,我这里创建了一个LocationHelper类并实现了ILocationProcess接口,在该类中使用init方法来初始化不同的定位服务:

    public class LocationHelper implements ILocationProcess {
        private static volatile LocationHelper mInstance;
        private ILocationProcess mProcesser;
    
        private LocationHelper() {
        }
    
        public static LocationHelper getInstance() {
            synchronized (LocationHelper.class) {
                if (mInstance == null) {
                    synchronized (LocationHelper.class) {
                        mInstance = new LocationHelper();
                    }
                }
            }
            return mInstance;
        }
    
        public void init(ILocationProcess process) {
            this.mProcesser = process;
        }
    
        @Override
        public void startLocation(ICallback callback) {
            if (mProcesser != null) {
                mProcesser.startLocation(callback);
            }
        }
    }
    

    使用方式比较简单,在我们的项目Application中进行初始化:

    public class MyApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            // LocationHelper.getInstance().init(new BaiduLocationProcess(this));
            LocationHelper.getInstance().init(new AMapLocationProcess(this));
        }
    

    在需要进行定位的地方调用以下方法即可:

         LocationHelper.getInstance().startLocation(location -> {
            Log.i("wilson", "高德:latitude:" + location.getLatitude() + "longitude:" + location.getLongitude());
         });
    

    到此一个简易的定位切换框架就搭建完成了,代码逻辑和设计模式还是相对比较简单的,但简单的功能却能大大提高我们的开发效率。

    相关文章

      网友评论

        本文标题:如何快速切换定位服务商

        本文链接:https://www.haomeiwen.com/subject/vegskctx.html