1. 程式人生 > >CMaps-國行安卓手機使用Google地圖服務解決方案

CMaps-國行安卓手機使用Google地圖服務解決方案

前言

Demo和原始碼請移步點選開啟連結

簡介

  • 相信很多Android開發人員都有這樣的痛點,當國內Android使用者在國外要使用地圖時,好像十分尷尬,沒有非常成熟的地圖解決方案。
  • 由於眾所周知的原因,谷歌的很多優秀服務在國內無法使用,其中國行手機由於閹割無法使用谷歌地圖服務是一個非常讓人頭痛的問題。主要問題有:
    • 一方面,國內地圖服務提供商(百度地圖、高德地圖、騰訊地圖)在境外的地圖資源少得可憐。
    • 另一方面,國行安卓手機由於系統缺少谷歌三大件,使得國行手機使用谷歌地圖服務幾乎變得不可能。
  • 本專案是為了解決該問題建立,圍繞Google給出的API介面資源,通過一系列技術方案,使得國行手機在沒有谷歌三大件的情況下也可以使用谷歌的地圖服務。主要特徵有:
    • 使用
      osmdroid
      根據定位智慧選擇伺服器載入谷歌瓦片地圖資源,境內境外均可使用。
    • 整合基於谷歌資料的多重定位方案,在國外實地測試定位準確率要明顯高於國內定位服務。---CLocation
    • 提供地址地理編碼查詢和地圖定位功能。
    • 封裝後的庫體積小、邏輯清晰、使用簡單,專案內還有多種相關實用工具可供使用。

使用前準備

需要的許可權

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

獲取Google Location API KEY

<meta-data
    android:name="GOOGLE_LOCATION_API_KEY"
    android:value="YOUR_API_KEY" />

使用過程

初始化

CMaps.getInstance().setmMapView(mMapView);

切換定位域名(非必須)

CMaps.getInstance().setMapLocationUrl("https://googleapis.xxxxxx.com/");
  • 雖然該方案最主要的目標使用者是在境外的國行手機,那麼訪問谷歌介面理應沒有太大問題,但是不排除除錯或者部分人需要在國內使用,特意封裝了修改定位域名的方法。

設定瓦片地圖源

//可以自行判斷能否使用google.com。true使用google.cn,false使用goole.com
//google.com源地圖更豐富,在牆外網路通暢的情況下建議使用google.com
//CMaps.getInstance().selectTileSource(false);
//根據ip選擇地圖源,這樣牆內牆外均可以使用
CMaps.getInstance().selectTileSource();

進行多重定位

CMaps.getInstance().mapLocation(getApplication(), this);

地理位置編碼查詢

CMapsTools.queryAddress(InputAddressActivity.this, address, new CMapsTools.OnLocation() {
    @Override
    public void location(double lat, double lon) {
        progressDialog.dismiss();
        Intent intent = new Intent(InputAddressActivity.this, MapActivity.class);
        intent.putExtra(MapActivity.CURRENT_LATITUDE, lat);
        intent.putExtra(MapActivity.CURRENT_LONGITUDE, lon);
        startActivity(intent);
    }
});

釋放資源

在activity生命週期stop中一定要釋放資源並且停止定位,以防資源浪費和異常奔潰

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

關於