天天看點

CLocation-國行安卓手機使用Google定位服務解決方案

國行安卓手機Google定位服務解決方案

前言

轉載請注明出處:http://blog.csdn.net/u010067411/article/details/79090500

Demo和源碼請移步點選打開連結

簡介

  • 相信很多Android開發人員都有這樣的痛點,當國内Android使用者在國外要使用地圖時,好像十分尴尬,沒有非常成熟的地圖解決方案。
  • 由于衆所周知的原因,谷歌的很多優秀服務在國内無法使用,其中國行手機由于閹割無法使用谷歌地圖服務是一個非常讓人頭痛的問題。主要問題有:
    • 一方面,國内地圖服務提供商(百度地圖、高德地圖、騰訊地圖)在境外的地圖資源少得可憐。
    • 另一方面,國行安卓手機由于系統缺少谷歌三大件,使得國行手機使用谷歌地圖服務幾乎變得不可能。
  • 本項目是為了解決地圖定位建立,圍繞Google給出的API接口資源,通過一系列技術方案,使得國行手機在沒有谷歌三大件的情況下也可以使用谷歌的地圖服務。主要特征有:
    • 包含WIFI信号、基站和GPS的多重定位方案,具有定位誤差小、适用性廣、低消耗、速度快等特點。
    • 基于谷歌資料的定位,在國外實地測試定位準确率要明顯高于國内定位服務。
    • 封裝後的庫體積小、邏輯清晰、使用簡單,項目内還有多種相關實用工具可供使用。
  • 國行安卓手機Google地圖服務解決方案,請移步點選打開連結

使用前準備

需要的權限

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />      

擷取Google Location API KEY

  • 由于定位資料來源于谷歌,是以需要在谷歌控制台擷取API KEY。詳情參考Google Maps Geolocation API
<meta-data
    android:name="GOOGLE_LOCATION_API_KEY"
    android:value="YOUR_API_KEY" />      

使用過程

切換定位域名(非必須)

GetLocation.getInstance().setNetworkLocationUrl("https://googleapis.xxxxxx.com/");      
  • 雖然該方案最主要的目标使用者是在境外的國行手機,那麼通路谷歌接口理應沒有太大問題,但是不排除調試或者部分人需要在國内使用,特意封裝了修改定位域名的方法。
    • 如果你想在中國境内使用本方案中的網絡定位,可在境外伺服器反向代理如下接口:https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY
    • 也可根據使用場景接入國内定位服務,在境外時使用CLocation,在境内時使用國内定位服務。

使用多重定位(需通路谷歌伺服器,境内網絡需翻牆)

GetLocation.getInstance().setMultiLocationListener(new GetLocation.OnMultiLocationListener() {
    @Override
    public void onMultiLocation(double multilatitude, double multilongitude, long multiupdateTime, float multiaccuracy, float multibearing) {
        Double latitude, longitude;
        MyLocation myLocation = new MyLocation(multilatitude, multilongitude);
        //由于坐标系差異,中國大陸坐标需要轉換
        if(BoundaryCheck.getInstance().IsInsideChina(myLocation)) {
            Point point = CoordinateConversion.wgs_gcj_encrypts(multilatitude, multilongitude);
            latitude = point.getLat();
            longitude = point.getLng();
        }else {
            latitude = multilatitude;
            longitude = multilongitude;
        }
        //經度:longitude,緯度:latitude,精度:multiaccuracy,方位:multiaccuracy,更新時間:multiupdateTime
    }

    @Override
    public void onFailed(int errorCode, String msg) {

    }
});
GetLocation.getInstance().startMultiLocation(getApplication(), this, false);      

使用網絡定位(需通路谷歌伺服器,境内網絡需翻牆)

GetLocation.getInstance().setNetworkLocationListener(new GetLocation.OnNetworkLocationListener() {
    @Override
    public void onNetworkLocation(double latitude, double longitude, long updateTime, float accuracy) {
        Double lat, lon;
        MyLocation myLocation = new MyLocation(latitude, longitude);
        //由于坐标系差異,中國大陸坐标需要轉換
        if(BoundaryCheck.getInstance().IsInsideChina(myLocation)) {
            Point point = CoordinateConversion.wgs_gcj_encrypts(latitude, longitude);
            lat = point.getLat();
            lon = point.getLng();
        }else {
            lat = latitude;
            lon = longitude;
        }
        //經度:longitude,緯度:latitude,精度:accuracy,更新時間:updateTime
    }

    @Override
    public void onFailed(int errorCode, String msg) {
        
    }
});
GetLocation.getInstance().startNetworkLocation(getApplication());      

使用GPS定位(需要在室外能搜尋到GPS信号的地方使用)

GetLocation.getInstance().setGPSLocationListener(new GetLocation.OnGPSLocationListener() {
    @Override
    public void onGPSLocation(double latitude, double longitude, long updateTime, float accuracy, float bearing) {
        Double lat, lon;
        MyLocation myLocation = new MyLocation(latitude, longitude);
        //由于坐标系差異,中國大陸坐标需要轉換
        if(BoundaryCheck.getInstance().IsInsideChina(myLocation)) {
            Point point = CoordinateConversion.wgs_gcj_encrypts(latitude, longitude);
            lat = point.getLat();
            lon = point.getLng();
        }else {
            lat = latitude;
            lon = longitude;
        }
        //經度:longitude,緯度:latitude,精度:accuracy,方位:accuracy,更新時間:updateTime
    }

    @Override
    public void onFailed(int errorCode, String msg) {
        
    }
});
GetLocation.getInstance().startGPSLocation(getApplication(),this);      

釋放資源

無論哪種的定位方式,在activity生命周期stop中一定要釋放資源并且停止定位,以防資源浪費和異常奔潰

@Override
protected void onStop() {
    super.onStop();
    GetLocation.getInstance().onStop();
}      

關于

  • 有任何建議或者使用中遇到問題都可以給我發郵件
  • Email:[email protected]