由於Google Maps的API版本更新,以前的一些教程都是關於舊版本V1的,雖然Google說繼續提供服務,可是再也不提供API Key的申請。 java
而新的V2版本貌似改動還挺大。也沒搜到國內有什麼系統介紹的博客文章之類的(書確定是來不及那麼新了)。 android
斷斷續續折騰了大概半個月,由於對Android也不是特別熟悉,因此碰到這樣那樣的問題。 git
終於在昨天看見模擬器上跑的地圖了。太感人了。 算法
下面就主要說說要成功作成這一件事的流程吧。 api
一些相關的連接: app
Google Maps Android API V1的介紹: less
https://developers.google.com/maps/documentation/android/v1/mapkey?hl=zh-CN ide
Google Maps Android API v2的初步介紹: 佈局
https://developers.google.com/maps/documentation/android/ ui
https://developers.google.com/maps/documentation/android/intro
(本部分參考https://developers.google.com/maps/documentation/android/start)
1.首先安裝Google Play services SDK
Google Maps Android API是做爲這個SDK的一部分發行的。
這個安裝是經過Android SDK Manager進行,配置好以後的Eclipse上面應該有Android SDK Manager的圖標,通常的SDK版本安裝和更新都在這裏進行。
安裝和更新Extras下的Google Play services便可。
2.獲取API key
獲取Maps API key須要兩樣東西:應用的signing certificate和它的package name。
獲取這個key以後,把它加在應用程序的AndroidManifest.xml文件裏便可。
爲應用獲取一個key仍是須要好幾個步驟的,下面詳細說明:
數字證書有Debug和Release兩種,下面主要說Debug的。
要獲取一個叫作SHA-1 fingerprint的東西,做爲數字證書的一個簡短表明。
這個指紋(fingerprint)是經過一個哈希算法獲得的字符串,爲了獲得你的證書的SHA-1 fingerprint,首先要找到你的debug keystore 文件,文件名叫debug.keystore。
默認狀況下它和虛擬機AVD存放在一塊兒,win7下的路徑是:C:\Users\your_user_name\.android\,也能夠經過Eclipse中的Windows > Prefs > Android > Build來查看這個路徑。
而後,在cmd命令行裏運行下列命令:
keytool -list -v -keystore "C:\Users\your_user_name\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
就顯示一大堆東西,其中就有證書指紋:
SHA1那一行就包含了證書的SHA-1 fingerprint,是二十段用冒號割開的數字段,每段是兩個十六進制的數。
在Google APIs Console上建立項目,而且註冊Maps API。
首先,去這個網址:https://code.google.com/apis/console/
用Gmail的帳戶登陸,若是是第一次的話,須要建立項目,默認狀況會建立一個叫作API Project的項目。
點擊左邊的Services,會在中間看到不少的APIs和Services,找到Google Maps Android API v2,而後把它設置成on,須要接受一些服務條款。
在左邊的導航條中選擇API Access。
在出來的頁面中選擇Create New Android Key...就能夠生成key了:
而後在對話框中填入:SHA-1 指紋, 分號隔開,而後是應用的 package name.而後就會生成一個Key。
好比:
3.把API Key加入應用程序
首先,創建虛擬設備AVD和應用程序。
關於AVD,官方文檔並沒詳細介紹,我後面會有說明。
創建好應用程序,注意包名應該和申請key時候的包名一致。
以後修改AndroidManifest.xml文件:
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your_api_key"/>
其中your_api_key置換成本身申請的API Key。
<permission android:name="com.example.mapdemo.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> <uses-permission android:name="com.example.mapdemo.permission.MAPS_RECEIVE"/>
其中com.example.mapdemo換成本身的包名。
4. AndroidManifest.xml中的其餘具體設置
<uses-permission> 做爲<manifest> 的子元素,須要加入下列一些:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
一樣也是做爲<manifest> 的子元素。
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
5.加上地圖
<?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.MapFragment"/>
程序編譯錯誤,顯示找不到一些類
如圖:
解決這個問題,首先須要把Google Play services的類庫加載進來:
在Eclipse裏面選擇:File > Import > Android > Existing Android Code Into Workspace而後點擊Next.
以後Browse..., 找到路徑下的<android-sdk-folder>/extras/google/google_play_services/libproject/google-play-services_lib, 而後選擇Finish。
注意,導入的時候須要把copy projects into workplace勾上,不然會在下一步的引用裏面出錯。
第二步是添加對這個庫的引用:
在本身的項目上右鍵,選Properties,左邊選Android,而後在下面的Library裏面Add剛纔的google-play-services_lib。
以後程序就應該能運行了。
接着你可能會碰到下面的問題:
程序運行成功,可是顯示This app won't run unless you update Google Play services.
如圖:
有傳言說V2不能在AVD上運行,可能Google還會對此問題進行更新。
通過搜索,這個問題已經在Stackoverflow上被討論過了,連接:http://stackoverflow.com/questions/13691943/this-app-wont-run-unless-you-update-google-play-services-via-bazaar
因此看來在AVD上運行的問題已經被解決了。
解決的方法就是在AVD上安裝兩個包(Google Play Store和Google Play services):vending.apk和gms.apk,(給一個網盤連接:http://pan.baidu.com/share/link?shareid=190602&uk=2701745266)
而且AVD就選擇普通的API 16就行,不須要是Google APIs。我選的是Android4.1 API16.
安裝時把那兩個包放在當前目錄,用命令行安裝:
以後運行程序,就出地圖了:
由於MapFragment只在API 12及以後的版本纔有,因此對於以前的版本須要使用Support Library來進行輔助。
若是minSdkVersion設置爲12之前的,就須要使用Support Library。
須要更改的地方是:佈局文件中,把MapFragment改成SupportMapFragment。
MainActivity繼承自FragmentActivity而不是Activity。(須要import android.support.v4.app.FragmentActivity;)
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.maptest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <permission android:name="com.example.maptest.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> <uses-permission android:name="com.example.maptest.permission.MAPS_RECEIVE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <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.maps.v2.API_KEY" android:value="AIzaSyAJRV7Rd_dlxnr8FYhQN3pEBUYFkhZWWpI"/> </application> </manifest>
MainActivity.java package com.example.maptest; import android.os.Bundle; import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
activity_main.xml <?xml version="1.0" encoding="utf-8"?> <fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps.SupportMapFragment"/>