【轉】Android 國內集成使用谷歌地圖

因爲衆作周知的緣由在國內使用谷歌地圖不太方便,在開發中若是直接使用會出現些問題。但國內的如百度地圖,高德地圖等都沒法提供詳細的國外地圖數據,因此研究一下嘍,,,java

使用 Google Maps Android API v2

使用谷歌提供的SDK,Android Studio開發。
  1. 首先保證SDK Manager中 Google Play service服務已經安裝。 
    這裏寫圖片描述

2.新建一個工程GoogleMapDemo,而後File ->Project Structure->[app]->->Dependences,點擊加號,添加play service依賴。 
這裏寫圖片描述 
3.要使用谷歌提低,須要到Google Developers Console申請一個Key。 
首先建立一個工程,而後在API標籤選擇啓用Google Maps Android API v2,也能夠順帶多選幾個好比JS的備用。 
這裏寫圖片描述
在 Credentials 標籤 Public API access 處添加一個Android key
這裏寫圖片描述 
使用用於簽名的keystore生成一個SHA-1指紋,能夠先使用debug.kestore。個人在C:\Users\RANDY.android\下。 
keytool -list -v -keystore debug.keystore 
密碼:android 
將生成的指紋填在指定輸入框,create OK。同時會生成一個API KEY。android

4.配置工程的Manifest文件:api

5.配置Activity,使用Fragment來顯示地圖。 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="map.randy.com.googlemapdemo" > <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- The following two permissions are not required to use Google Maps Android API v2, but are recommended. --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="*API_KEY*"/> </application> </manifest>

佈局:markdown

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:text="@string/hello_world" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <fragment android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.google.android.gms.maps.MapFragment"/> </RelativeLayout>

 

MainActivityapp

package map.randy.com.googlemapdemo; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; public class MainActivity extends FragmentActivity implements OnMapReadyCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { LatLng sydney = new LatLng(-33.867, 151.206); googleMap.setMyLocationEnabled(true); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); googleMap.addMarker(new MarkerOptions() .title("Sydney") .snippet("The most populous city in Australia.") .position(sydney)); } }

運行: 
效果dom

可是這是在FQ狀況下,,若是沒有FQ,只能是空白。。。ide

而谷歌在V2提供了一個遮罩層,開發者能夠使用它來自定義地圖。佈局

package map.randy.com.googlemapdemo; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.OnMapReadyCallback; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.TileOverlayOptions; import com.google.android.gms.maps.model.TileProvider; import com.google.android.gms.maps.model.UrlTileProvider; import java.net.MalformedURLException; import java.net.URL; import java.util.Random; public class MainActivity extends FragmentActivity implements OnMapReadyCallback { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MapFragment mapFragment = (MapFragment) getFragmentManager() .findFragmentById(R.id.map); TileProvider tileProvider = new UrlTileProvider(512, 512) { @Override public URL getTileUrl(int x, int y, int zoom) { /* Define the URL pattern for the tile images */ Random random = new Random(); String s = String.format("http://mt"+random.nextInt(3)+".google.cn/vt/lyrs=m@142&hl=zh-CN&gl=cn&x=%d&y=%d&z=%d&s=Galil", x, y,zoom); if (!checkTileExists(x, y, zoom)) { return null; } try { return new URL(s); } catch (MalformedURLException e) { throw new AssertionError(e); } } }; TileOverlayOptions tpo = new TileOverlayOptions(); tpo.tileProvider(tileProvider); mapFragment.getMap().addTileOverlay(tpo); mapFragment.getMap().setMapType(GoogleMap.MAP_TYPE_NONE); mapFragment.getMapAsync(this); } private boolean checkTileExists(int x, int y, int zoom) { int minZoom = 12; int maxZoom = 16; if ((zoom < minZoom || zoom > maxZoom)) { return false; } return true; } @Override public void onMapReady(GoogleMap googleMap) { LatLng sydney = new LatLng(-33.867, 151.206); googleMap.setMyLocationEnabled(true); googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 13)); googleMap.addMarker(new MarkerOptions() .title("Sydney") .snippet("The most populous city in Australia.") .position(sydney)); } }

 

不過經測試發現不知爲什麼這種方法實現的圖片質量有點低。。囧。。。 
這裏寫圖片描述
待續。。。測試

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。ui

相關文章
相關標籤/搜索