建立一個新的使用了Google Maps Android API v2的Android應用須要許多個步驟。這一節中所概述的其中的許多步驟只是須要必須執行一次而已,但有些信息則是將來應用開發方便的參考。給一個Android應用程序添加一個地圖的整體過程以下: html
你也可能想要經過查看示例代碼來開始,示例代碼包含在Google Play services SDK中。 java
這是一個先決條件,你須要安裝Android SDK。請參考獲取Android SDK。 android
你將須要爲你的app建立一個Android工程,來完成這個小節的那些步驟。若是你尚未建立一個Android應用,你能夠按照指南來建立一個"hello world" app。請參考建立一個Android工程。 web
Google Maps Android API v2是做爲Google Play services SDK的一部分來分發的。你能夠經過Android SDK Manager來下載 Google Play services SDK。 算法
更詳細的說明,請參考Google Play services文檔。這裏是你須要執行的步驟的一個總結: shell
編輯你的應用程序的AndroidManifest.xml文件,並在<application>元素內添加以下的聲明。這會嵌入編譯app所使用的Google Play services的版本。 編程
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
注意:Google Maps Android API v2使用了一個新的管理key的系統。來自於一個Google Maps Android v1應用程序的現存的key,一般被稱爲MapView,在使用v2 API時將是無效的。 windows
爲了經過Maps API訪問Google Maps服務器,你不得不給你的應用程序添加一個Maps API key 。這個key是免費的,你能夠在你任何調用了Maps API的應用程序中使用,並且它支持無限多的用戶。你能夠經過提供你的應用程序的簽名證書及它的包名,從Google APIs Console,獲取一個Maps API key。經過給你的應用程序的AndroidManifest.xml文件添加一個元素來爲你的應用添加key。 api
理解註冊你的應用程序及獲取一個key的過程,還須要一些關於Android應用的發佈過程和要求的知識。總結一下,全部的Andriod應用都必須經過一個數字證書來簽名,而你持有着私有的key。因爲數字證書是惟一的,它們提供了一種簡單的方式來惟一的識別你的app。這對於在系統中追蹤你的應用程序頗有用,好比像Google Play Store,對於追蹤你的應用程序使用的resource,好比Google Maps服務器,也頗有用。 瀏覽器
注意:參考Android指南認證你的應用程序來獲取更多關於數字認證的信息。
Maps API keys是與特定的 證書/包 對關聯的,而不是與用戶或應用程序。每一個證書你只須要一個key便可,而不管你的一個應用程序有多少用戶。使用了相同的證書的應用程序可使用相同API key。然而,建議的方式是爲你的每個應用程序經過一個不一樣的證書獲取一個不一樣的key來認證。
爲你的應用程序獲取一個key須要幾個步驟。這些步驟列出以下,並將在接下來的小節中詳細描述。
注意: 商業Google Maps Mobile SDK的用戶必須額外的爲他們的API工程啓用 SDK。
Maps API key是基於你的應用程序數字證書的一個short form的,被稱爲它的SHA-1指紋。這個指紋是由通用的SHA-1哈希算法產生的一個惟一的文本串。因爲這個指紋自己是惟一的,因此Google Maps使用它來做爲識別你的應用程序的一種方式。
爲了給你的證書顯示SHA-1指紋,首先要確保你正在使用正確的證書。你可能有兩個證書:
你可使用keytool程序加-v參數來顯示一個證書的SHA-1指紋。更多關於Keytool的信息,請參考文檔http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html。
展開下面的小節,來了解關於如何顯示你的debug或release證書的詳細的指導。
定位你的debug keystore文件。文件名爲debug.keystore,在你第一次編譯你的工程時建立。默認地,它與你的Android Virtual Device (AVD)文件存儲在相同的目錄下:
若是你同時在使用ADT與Eclipse,而且你不肯定你的debug keystone位置在哪兒,你能夠選擇Windows > Prefs > Android > Build來查看完整的路徑,你能夠把這個路徑粘貼到一個文件瀏覽器來定位包含了keystore的目錄。
列出SHA-1指紋。
對於Linux或OS X,打開一個終端窗口並鍵入下列內容:
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
對於Windows Vista和Windows 7,執行:
keytool -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
你應當看到與下面相似的輸出:
Alias name: androiddebugkey Creation date: Jan 01, 2013 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Android Debug, O=Android, C=US Issuer: CN=Android Debug, O=Android, C=US Serial number: 4aa9b300 Valid from: Mon Jan 01 08:04:04 UTC 2013 until: Mon Jan 01 18:04:04 PST 2033 Certificate fingerprints: MD5: AE:9F:95:D0:A6:86:89:BC:A8:70:BA:34:FF:6A:AC:F9 SHA1: BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75 Signature algorithm name: SHA1withRSA Version: 3
以SHA1開頭的那一行包含了證書的SHA-1指紋。指紋是由冒號隔開的20對兩位16進制數的序列。
定位你的release證書keystore文件。對於release keystore則沒有默認的位置或名字。若是你不在爲你的應用程序編譯release版時指定一個,則編譯出來的.apk將是未簽名的,而且你將不得不在你能夠發佈它以前簽名。對於release證書,爲keystore和證書,你也須要證書的別名和密碼。你能夠經過輸入下面內容來列出keystore中全部的keys的別名:
keytool -list -keystoreyour_keystore_name
將your_keystore_name用完整的路徑和keystore的名字來替換,包含.keystore擴展名。你將會看到keystore的密碼的提示。你但你鍵入了它,keytool將顯示出keystore中全部的別名。
在一個終端或命令提示符中鍵入下面內容:
keytool -list -v -keystoreyour_keystore_name-aliasyour_alias_name
將your_keystore_name 用完整的路徑和keystore的名字來替換,包含.keystore擴展名。將your_alias_name用建立它時分配給證書的別名來替換。
注意:爲了保護你的keystore和key,不要在命令行鍵入storepass或keypass參數,除非你對你的電腦的安全性很是自信。好比,在一臺公共的電腦上,某些人可能會看到你的終端窗口的歷史,或列出正在運行的進程,獲取密碼,而後具備對你的簽名證書的寫權限。這將容許那些人修改或用他們本身的應用來替換你的應用。
你應當看到與下面內容相似的輸出:
Alias name: <alias_name> Creation date: Feb 02, 2013 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Android Debug, O=Android, C=US Issuer: CN=Android Debug, O=Android, C=US Serial number: 4cc9b300 Valid from: Mon Feb 02 08:01:04 UTC 2013 until: Mon Feb 02 18:05:04 PST 2033 Certificate fingerprints: MD5: AE:9F:95:D0:A6:86:89:BC:A8:70:BA:34:FF:6B:AC:F9 SHA1: BB:0D:AC:74:D3:21:E1:43:67:71:9B:62:90:AF:A1:66:6E:44:5D:75 Signature algorithm name: SHA1withRSA Version: 3以 SHA1開頭的那一行包含了證書的 SHA-1指紋。指紋 是由冒號隔開的20對兩位16進制數的序列。
遵循以下的步驟,在Google APIs Console中爲你的應用程序建立或修改一個工程,併爲Maps API執行註冊。
若是你的應用程序已經完成了對Google Maps Android API v2服務的註冊,則你能夠請求一個API key了。每一個工程註冊多於一個的key也是可能的。
在結果對話框中,鍵入SHA-1指紋,而後是一個分號,而後是你的應用程序的包名。好比:
BB:0D:AC:74:D3:21:E1:43:67:71:9B:62:91:AF:A1:66:6E:44:5D:75;com.example.android.mapexample
Google APIs Console經過顯示Key for Android apps (with certificates),並後跟一個四十字符的API key來做出反應,好比:
AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0
遵循下面的步驟來在你的應用程序的manifest中包含API key,包含在AndroidManifest.xml文件中。Maps API從這兒讀取key值並將它傳給Google Maps服務器,以確認你具備對Google Maps數據的訪問權限。
1. 在AndroidManifest.xml中,添加下面的元素做爲<application>元素的一個子元素,經過在閉合標籤</application>以前插入它來實現:
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="API_KEY"/>
用你的API key來替換API_KEY。這個元素將鍵 com.google.android.maps.v2.API_KEY的值設爲API_KEY並使得API key對於你的應用程序中的任何MapFragment都是可見的。
2. 保存AndroidManifest.xml,而後從新編譯你的應用程序
一個使用了Google Maps Android API的android應用程序應該在它的manifest文件中指定以下的設置,AndroidManifest.xml:
指定你的應用程序須要的permissions,經過添加<uses-permission>元素做爲<manifest>元素的子元素來實現。語法爲:
<uses-permission android:name="permission_name"/>
好比,請求Internet permission,添加:
<uses-permission android:name="android.permission.INTERNET"/>
除了你的應用程序其餘部分須要的權限,你必須添加以下的權限以使用Google Maps Android API:
下面的permissions是建議添加的,但若是你的應用程序不訪問用戶的當前位置,以編程的方式,或啓用My Location層,則能夠忽略,
android.permission.ACCESS_FINE_LOCATION 容許API使用全球定位系統(GPS)來在一個很是小的區域內決定設備的位置。
<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"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <!-- 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"/>
Google Maps Android API使用OpenGL ES版本2來渲染地圖。若是沒有安裝OpenGL ES版本2,你的地圖將不會出現。咱們建議你在AndroidManifest.xml中添加以下的<uses-feature>元素,做爲<manifest>元素的一個子元素:
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
這個元素通知須要的外部服務。特別地,它具備阻止Google Play Store將你的應用程序顯示在不支持OpenGL ES版本2的設備上的效果。
測試你的應用程序是否被正確配置的最簡單的方式是添加一個簡單的地圖。你將不得不修改兩個文件:定義了app的layout的XML文件,及main activity Java文件。
請注意下面的代碼只在測試目標平臺爲Android API 12或更新的應用程序的設置時有用。這段代碼不該該被用於一個產品應用程序中。如何添加更健壯的代碼的例子將貫穿於這份指南,並出如今示例代碼中。
1. 在app的layout XML文件中添加以下的fragment。若是你使用Eclipse中的Android Developer Tools (ADT)包建立了一個‘hello world’ app,則這個文件爲res/layout/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" android:name="com.google.android.gms.maps.MapFragment"/>2. 在 MainActivity.java中添加以下的代碼:
package com.example.mapdemo; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
3. 編譯並運行你的應用程序。你應該能看到一個地圖。若是你沒有看到一個地圖,請確認你已經完成了本頁中所描述的全部的步驟。
1. 首先,用eclipse,以默認的方式建立一個hello world app,並將它的main layout文件的內容替換爲前述只有一個MapFragment的layout,而後便執行應用程序。不出所料,這個app是沒法運行起來的,會有以下的一個exception拋出來:
11-30 16:31:59.341: D/dalvikvm(6202): Late-enabling CheckJNI 11-30 16:31:59.491: E/ActivityThread(6202): Failed to inflate 11-30 16:31:59.491: E/ActivityThread(6202): android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 16:31:59.491: E/ActivityThread(6202): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 11-30 16:31:59.491: E/ActivityThread(6202): at android.view.LayoutInflater.inflate(LayoutInflater.java:469) 11-30 16:31:59.491: E/ActivityThread(6202): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 11-30 16:31:59.491: E/ActivityThread(6202): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 11-30 16:31:59.491: E/ActivityThread(6202): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.Activity.setContentView(Activity.java:1895) 11-30 16:31:59.491: E/ActivityThread(6202): at com.hanpfei.mymapexample.MainActivity.onCreate(MainActivity.java:12) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.Activity.performCreate(Activity.java:5133) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.ActivityThread.access$600(ActivityThread.java:153) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) 11-30 16:31:59.491: E/ActivityThread(6202): at android.os.Handler.dispatchMessage(Handler.java:99) 11-30 16:31:59.491: E/ActivityThread(6202): at android.os.Looper.loop(Looper.java:137) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.ActivityThread.main(ActivityThread.java:5289) 11-30 16:31:59.491: E/ActivityThread(6202): at java.lang.reflect.Method.invokeNative(Native Method) 11-30 16:31:59.491: E/ActivityThread(6202): at java.lang.reflect.Method.invoke(Method.java:525) 11-30 16:31:59.491: E/ActivityThread(6202): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 11-30 16:31:59.491: E/ActivityThread(6202): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 11-30 16:31:59.491: E/ActivityThread(6202): at dalvik.system.NativeStart.main(Native Method) 11-30 16:31:59.491: E/ActivityThread(6202): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.google.android.gms.maps.MapFragment: make sure class name exists, is public, and has an empty constructor that is public 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.Fragment.instantiate(Fragment.java:592) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.Fragment.instantiate(Fragment.java:560) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.Activity.onCreateView(Activity.java:4738) 11-30 16:31:59.491: E/ActivityThread(6202): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) 11-30 16:31:59.491: E/ActivityThread(6202): ... 20 more 11-30 16:31:59.491: E/ActivityThread(6202): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.maps.MapFragment" on path: DexPathList[[zip file "/data/app/com.hanpfei.mymapexample-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.hanpfei.mymapexample-1, /vendor/lib, /system/lib]] 11-30 16:31:59.491: E/ActivityThread(6202): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53) 11-30 16:31:59.491: E/ActivityThread(6202): at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 11-30 16:31:59.491: E/ActivityThread(6202): at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 11-30 16:31:59.491: E/ActivityThread(6202): at android.app.Fragment.instantiate(Fragment.java:582) 11-30 16:31:59.491: E/ActivityThread(6202): ... 23 more 11-30 16:31:59.491: D/AndroidRuntime(6202): Shutting down VM 11-30 16:31:59.491: W/dalvikvm(6202): threadid=1: thread exiting with uncaught exception (group=0x415367c0) 11-30 16:31:59.491: E/AndroidRuntime(6202): FATAL EXCEPTION: main 11-30 16:31:59.491: E/AndroidRuntime(6202): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hanpfei.mymapexample/com.hanpfei.mymapexample.MainActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.ActivityThread.access$600(ActivityThread.java:153) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.os.Handler.dispatchMessage(Handler.java:99) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.os.Looper.loop(Looper.java:137) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.ActivityThread.main(ActivityThread.java:5289) 11-30 16:31:59.491: E/AndroidRuntime(6202): at java.lang.reflect.Method.invokeNative(Native Method) 11-30 16:31:59.491: E/AndroidRuntime(6202): at java.lang.reflect.Method.invoke(Method.java:525) 11-30 16:31:59.491: E/AndroidRuntime(6202): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 11-30 16:31:59.491: E/AndroidRuntime(6202): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 11-30 16:31:59.491: E/AndroidRuntime(6202): at dalvik.system.NativeStart.main(Native Method) 11-30 16:31:59.491: E/AndroidRuntime(6202): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.view.LayoutInflater.inflate(LayoutInflater.java:469) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 11-30 16:31:59.491: E/AndroidRuntime(6202): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.Activity.setContentView(Activity.java:1895) 11-30 16:31:59.491: E/AndroidRuntime(6202): at com.hanpfei.mymapexample.MainActivity.onCreate(MainActivity.java:12) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.Activity.performCreate(Activity.java:5133) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) 11-30 16:31:59.491: E/AndroidRuntime(6202): ... 11 more 11-30 16:31:59.491: E/AndroidRuntime(6202): Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.google.android.gms.maps.MapFragment: make sure class name exists, is public, and has an empty constructor that is public 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.Fragment.instantiate(Fragment.java:592) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.Fragment.instantiate(Fragment.java:560) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.Activity.onCreateView(Activity.java:4738) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) 11-30 16:31:59.491: E/AndroidRuntime(6202): ... 20 more 11-30 16:31:59.491: E/AndroidRuntime(6202): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.maps.MapFragment" on path: DexPathList[[zip file "/data/app/com.hanpfei.mymapexample-1.apk"],nativeLibraryDirectories=[/data/app-lib/com.hanpfei.mymapexample-1, /vendor/lib, /system/lib]] 11-30 16:31:59.491: E/AndroidRuntime(6202): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:53) 11-30 16:31:59.491: E/AndroidRuntime(6202): at java.lang.ClassLoader.loadClass(ClassLoader.java:501) 11-30 16:31:59.491: E/AndroidRuntime(6202): at java.lang.ClassLoader.loadClass(ClassLoader.java:461) 11-30 16:31:59.491: E/AndroidRuntime(6202): at android.app.Fragment.instantiate(Fragment.java:582) 11-30 16:31:59.491: E/AndroidRuntime(6202): ... 23 more
2. 總之意思就是說,找不到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。(若是沒有這個庫,請在Android SDK Manager更新,在底端的Extras裏面更新Google Play services便可)。
而後是添加對這個庫的引用:
在本身的項目上右鍵,選Properties,左邊選Android,而後在下面的Library裏面Add剛纔的google-play-services_lib。
3. 這個時候,應用程序是連編譯都編譯不過。解決方法就是要先把上一步建立出來的那個google-play-services_lib的project編譯一下。OK,能夠編譯了,那就再一次編譯執行。此次又遇到了另外的一個exception:
11-30 17:02:56.262: E/ActivityThread(9967): Failed to inflate 11-30 17:02:56.262: E/ActivityThread(9967): android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 17:02:56.262: E/ActivityThread(9967): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 11-30 17:02:56.262: E/ActivityThread(9967): at android.view.LayoutInflater.inflate(LayoutInflater.java:469) 11-30 17:02:56.262: E/ActivityThread(9967): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 11-30 17:02:56.262: E/ActivityThread(9967): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 11-30 17:02:56.262: E/ActivityThread(9967): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320) 11-30 17:02:56.262: E/ActivityThread(9967): at android.app.Activity.setContentView(Activity.java:1895) 11-30 17:02:56.262: E/ActivityThread(9967): at com.hanpfei.mymapexample.MainActivity.onCreate(MainActivity.java:12) 11-30 17:02:56.262: E/ActivityThread(9967): at android.app.Activity.performCreate(Activity.java:5133) 11-30 17:02:56.262: E/ActivityThread(9967): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-30 17:02:56.262: E/ActivityThread(9967): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) 11-30 17:02:56.262: E/ActivityThread(9967): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 11-30 17:02:56.262: E/ActivityThread(9967): at android.app.ActivityThread.access$600(ActivityThread.java:153) 11-30 17:02:56.262: E/ActivityThread(9967): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) 11-30 17:02:56.262: E/ActivityThread(9967): at android.os.Handler.dispatchMessage(Handler.java:99) 11-30 17:02:56.262: E/ActivityThread(9967): at android.os.Looper.loop(Looper.java:137) 11-30 17:02:56.262: E/ActivityThread(9967): at android.app.ActivityThread.main(ActivityThread.java:5289) 11-30 17:02:56.262: E/ActivityThread(9967): at java.lang.reflect.Method.invokeNative(Native Method) 11-30 17:02:56.262: E/ActivityThread(9967): at java.lang.reflect.Method.invoke(Method.java:525) 11-30 17:02:56.262: E/ActivityThread(9967): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 11-30 17:02:56.262: E/ActivityThread(9967): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 11-30 17:02:56.262: E/ActivityThread(9967): at dalvik.system.NativeStart.main(Native Method) 11-30 17:02:56.262: E/ActivityThread(9967): Caused by: java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist. You must have the following declaration within the <application> element: <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.common.GooglePlayServicesUtil.n(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.maps.internal.q.v(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.maps.internal.q.u(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.maps.MapsInitializer.initialize(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.maps.MapFragment$b.cE(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.maps.MapFragment$b.a(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.dynamic.a.a(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.dynamic.a.onInflate(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at com.google.android.gms.maps.MapFragment.onInflate(Unknown Source) 11-30 17:02:56.262: E/ActivityThread(9967): at android.app.Activity.onCreateView(Activity.java:4745) 11-30 17:02:56.262: E/ActivityThread(9967): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) 11-30 17:02:56.262: E/ActivityThread(9967): ... 20 more 11-30 17:02:56.262: D/AndroidRuntime(9967): Shutting down VM 11-30 17:02:56.262: W/dalvikvm(9967): threadid=1: thread exiting with uncaught exception (group=0x415367c0) 11-30 17:02:56.262: E/AndroidRuntime(9967): FATAL EXCEPTION: main 11-30 17:02:56.262: E/AndroidRuntime(9967): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hanpfei.mymapexample/com.hanpfei.mymapexample.MainActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.ActivityThread.access$600(ActivityThread.java:153) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.os.Handler.dispatchMessage(Handler.java:99) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.os.Looper.loop(Looper.java:137) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.ActivityThread.main(ActivityThread.java:5289) 11-30 17:02:56.262: E/AndroidRuntime(9967): at java.lang.reflect.Method.invokeNative(Native Method) 11-30 17:02:56.262: E/AndroidRuntime(9967): at java.lang.reflect.Method.invoke(Method.java:525) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 11-30 17:02:56.262: E/AndroidRuntime(9967): at dalvik.system.NativeStart.main(Native Method) 11-30 17:02:56.262: E/AndroidRuntime(9967): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.view.LayoutInflater.inflate(LayoutInflater.java:469) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.Activity.setContentView(Activity.java:1895) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.hanpfei.mymapexample.MainActivity.onCreate(MainActivity.java:12) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.Activity.performCreate(Activity.java:5133) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) 11-30 17:02:56.262: E/AndroidRuntime(9967): ... 11 more 11-30 17:02:56.262: E/AndroidRuntime(9967): Caused by: java.lang.IllegalStateException: A required meta-data tag in your app's AndroidManifest.xml does not exist. You must have the following declaration within the <application> element: <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.common.GooglePlayServicesUtil.n(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.common.GooglePlayServicesUtil.isGooglePlayServicesAvailable(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.maps.internal.q.v(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.maps.internal.q.u(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.maps.MapsInitializer.initialize(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.maps.MapFragment$b.cE(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.maps.MapFragment$b.a(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.dynamic.a.a(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.dynamic.a.onInflate(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at com.google.android.gms.maps.MapFragment.onInflate(Unknown Source) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.app.Activity.onCreateView(Activity.java:4745) 11-30 17:02:56.262: E/AndroidRuntime(9967): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) 11-30 17:02:56.262: E/AndroidRuntime(9967): ... 20 more
4. 這個exception呢,大致意思就是說,在app的AndroidManifest.xml文件中少加入了一個<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />標籤。OK,咱們遵守前面文檔的說明,把這個元素加入到AndroidManifest.xml文件就是了,能夠參考文檔前面的添加Google Play services版本到你app的manifest部分,把那兩行code直接複製粘貼便可。不過咱們卻又遭遇了另外一個exception:
11-30 17:09:34.261: E/ActivityThread(10763): Failed to inflate 11-30 17:09:34.261: E/ActivityThread(10763): android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 17:09:34.261: E/ActivityThread(10763): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 11-30 17:09:34.261: E/ActivityThread(10763): at android.view.LayoutInflater.inflate(LayoutInflater.java:469) 11-30 17:09:34.261: E/ActivityThread(10763): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 11-30 17:09:34.261: E/ActivityThread(10763): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 11-30 17:09:34.261: E/ActivityThread(10763): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.Activity.setContentView(Activity.java:1895) 11-30 17:09:34.261: E/ActivityThread(10763): at com.hanpfei.mymapexample.MainActivity.onCreate(MainActivity.java:12) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.Activity.performCreate(Activity.java:5133) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.ActivityThread.access$600(ActivityThread.java:153) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) 11-30 17:09:34.261: E/ActivityThread(10763): at android.os.Handler.dispatchMessage(Handler.java:99) 11-30 17:09:34.261: E/ActivityThread(10763): at android.os.Looper.loop(Looper.java:137) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.ActivityThread.main(ActivityThread.java:5289) 11-30 17:09:34.261: E/ActivityThread(10763): at java.lang.reflect.Method.invokeNative(Native Method) 11-30 17:09:34.261: E/ActivityThread(10763): at java.lang.reflect.Method.invoke(Method.java:525) 11-30 17:09:34.261: E/ActivityThread(10763): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 11-30 17:09:34.261: E/ActivityThread(10763): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 11-30 17:09:34.261: E/ActivityThread(10763): at dalvik.system.NativeStart.main(Native Method) 11-30 17:09:34.261: E/ActivityThread(10763): Caused by: java.lang.SecurityException: The Maps API requires the additional following permissions to be set in the AndroidManifest.xml to ensure a correct behavior: 11-30 17:09:34.261: E/ActivityThread(10763): <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 11-30 17:09:34.261: E/ActivityThread(10763): <uses-permission android:name="android.permission.INTERNET"/> 11-30 17:09:34.261: E/ActivityThread(10763): <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 11-30 17:09:34.261: E/ActivityThread(10763): <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 11-30 17:09:34.261: E/ActivityThread(10763): at maps.af.cf.a(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at maps.af.ay.a(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at maps.af.al.a(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at maps.af.be.a(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at maps.af.bd.a(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at cmj.onTransact(SourceFile:107) 11-30 17:09:34.261: E/ActivityThread(10763): at android.os.Binder.transact(Binder.java:347) 11-30 17:09:34.261: E/ActivityThread(10763): at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at com.google.android.gms.maps.MapFragment$a.onCreateView(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at com.google.android.gms.dynamic.a$4.b(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at com.google.android.gms.dynamic.a.a(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at com.google.android.gms.dynamic.a.onCreateView(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at com.google.android.gms.maps.MapFragment.onCreateView(Unknown Source) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.Fragment.performCreateView(Fragment.java:1695) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:861) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137) 11-30 17:09:34.261: E/ActivityThread(10763): at android.app.Activity.onCreateView(Activity.java:4746) 11-30 17:09:34.261: E/ActivityThread(10763): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) 11-30 17:09:34.261: E/ActivityThread(10763): ... 20 more 11-30 17:09:34.261: D/AndroidRuntime(10763): Shutting down VM 11-30 17:09:34.261: W/dalvikvm(10763): threadid=1: thread exiting with uncaught exception (group=0x415367c0) 11-30 17:09:34.261: E/AndroidRuntime(10763): FATAL EXCEPTION: main 11-30 17:09:34.261: E/AndroidRuntime(10763): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hanpfei.mymapexample/com.hanpfei.mymapexample.MainActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.ActivityThread.access$600(ActivityThread.java:153) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.os.Handler.dispatchMessage(Handler.java:99) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.os.Looper.loop(Looper.java:137) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.ActivityThread.main(ActivityThread.java:5289) 11-30 17:09:34.261: E/AndroidRuntime(10763): at java.lang.reflect.Method.invokeNative(Native Method) 11-30 17:09:34.261: E/AndroidRuntime(10763): at java.lang.reflect.Method.invoke(Method.java:525) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 11-30 17:09:34.261: E/AndroidRuntime(10763): at dalvik.system.NativeStart.main(Native Method) 11-30 17:09:34.261: E/AndroidRuntime(10763): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.view.LayoutInflater.inflate(LayoutInflater.java:469) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.Activity.setContentView(Activity.java:1895) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.hanpfei.mymapexample.MainActivity.onCreate(MainActivity.java:12) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.Activity.performCreate(Activity.java:5133) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) 11-30 17:09:34.261: E/AndroidRuntime(10763): ... 11 more 11-30 17:09:34.261: E/AndroidRuntime(10763): Caused by: java.lang.SecurityException: The Maps API requires the additional following permissions to be set in the AndroidManifest.xml to ensure a correct behavior: 11-30 17:09:34.261: E/AndroidRuntime(10763): <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 11-30 17:09:34.261: E/AndroidRuntime(10763): <uses-permission android:name="android.permission.INTERNET"/> 11-30 17:09:34.261: E/AndroidRuntime(10763): <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 11-30 17:09:34.261: E/AndroidRuntime(10763): <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 11-30 17:09:34.261: E/AndroidRuntime(10763): at maps.af.cf.a(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at maps.af.ay.a(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at maps.af.al.a(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at maps.af.be.a(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at maps.af.bd.a(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at cmj.onTransact(SourceFile:107) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.os.Binder.transact(Binder.java:347) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.google.android.gms.maps.MapFragment$a.onCreateView(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.google.android.gms.dynamic.a$4.b(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.google.android.gms.dynamic.a.a(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.google.android.gms.dynamic.a.onCreateView(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at com.google.android.gms.maps.MapFragment.onCreateView(Unknown Source) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.Fragment.performCreateView(Fragment.java:1695) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:861) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.app.Activity.onCreateView(Activity.java:4746) 11-30 17:09:34.261: E/AndroidRuntime(10763): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) 11-30 17:09:34.261: E/AndroidRuntime(10763): ... 20 more
5. 此次是關於權限的。那咱們就將前文中提到的要添加的那些權限都加進去。必需要的4種,可選的兩種。真是讓人無奈,編譯執行以後,仍是有exception拋出來:
11-30 17:14:36.155: I/Process(11373): Sending signal. PID: 11373 SIG: 9 11-30 17:14:41.851: E/ActivityThread(11619): Failed to inflate 11-30 17:14:41.851: E/ActivityThread(11619): android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 17:14:41.851: E/ActivityThread(11619): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 11-30 17:14:41.851: E/ActivityThread(11619): at android.view.LayoutInflater.inflate(LayoutInflater.java:469) 11-30 17:14:41.851: E/ActivityThread(11619): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 11-30 17:14:41.851: E/ActivityThread(11619): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 11-30 17:14:41.851: E/ActivityThread(11619): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.Activity.setContentView(Activity.java:1895) 11-30 17:14:41.851: E/ActivityThread(11619): at com.hanpfei.mymapexample.MainActivity.onCreate(MainActivity.java:12) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.Activity.performCreate(Activity.java:5133) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.ActivityThread.access$600(ActivityThread.java:153) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) 11-30 17:14:41.851: E/ActivityThread(11619): at android.os.Handler.dispatchMessage(Handler.java:99) 11-30 17:14:41.851: E/ActivityThread(11619): at android.os.Looper.loop(Looper.java:137) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.ActivityThread.main(ActivityThread.java:5289) 11-30 17:14:41.851: E/ActivityThread(11619): at java.lang.reflect.Method.invokeNative(Native Method) 11-30 17:14:41.851: E/ActivityThread(11619): at java.lang.reflect.Method.invoke(Method.java:525) 11-30 17:14:41.851: E/ActivityThread(11619): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 11-30 17:14:41.851: E/ActivityThread(11619): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 11-30 17:14:41.851: E/ActivityThread(11619): at dalvik.system.NativeStart.main(Native Method) 11-30 17:14:41.851: E/ActivityThread(11619): Caused by: java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml 11-30 17:14:41.851: E/ActivityThread(11619): at maps.af.ay.a(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at maps.af.ay.a(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at maps.af.al.a(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at maps.af.be.a(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at maps.af.bd.a(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at cmj.onTransact(SourceFile:107) 11-30 17:14:41.851: E/ActivityThread(11619): at android.os.Binder.transact(Binder.java:347) 11-30 17:14:41.851: E/ActivityThread(11619): at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at com.google.android.gms.maps.MapFragment$a.onCreateView(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at com.google.android.gms.dynamic.a$4.b(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at com.google.android.gms.dynamic.a.a(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at com.google.android.gms.dynamic.a.onCreateView(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at com.google.android.gms.maps.MapFragment.onCreateView(Unknown Source) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.Fragment.performCreateView(Fragment.java:1695) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:861) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137) 11-30 17:14:41.851: E/ActivityThread(11619): at android.app.Activity.onCreateView(Activity.java:4746) 11-30 17:14:41.851: E/ActivityThread(11619): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) 11-30 17:14:41.851: E/ActivityThread(11619): ... 20 more 11-30 17:14:41.861: D/AndroidRuntime(11619): Shutting down VM 11-30 17:14:41.861: W/dalvikvm(11619): threadid=1: thread exiting with uncaught exception (group=0x415367c0) 11-30 17:14:41.861: E/AndroidRuntime(11619): FATAL EXCEPTION: main 11-30 17:14:41.861: E/AndroidRuntime(11619): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hanpfei.mymapexample/com.hanpfei.mymapexample.MainActivity}: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2339) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.ActivityThread.access$600(ActivityThread.java:153) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1269) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.os.Handler.dispatchMessage(Handler.java:99) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.os.Looper.loop(Looper.java:137) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.ActivityThread.main(ActivityThread.java:5289) 11-30 17:14:41.861: E/AndroidRuntime(11619): at java.lang.reflect.Method.invokeNative(Native Method) 11-30 17:14:41.861: E/AndroidRuntime(11619): at java.lang.reflect.Method.invoke(Method.java:525) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555) 11-30 17:14:41.861: E/AndroidRuntime(11619): at dalvik.system.NativeStart.main(Native Method) 11-30 17:14:41.861: E/AndroidRuntime(11619): Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class fragment 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.view.LayoutInflater.inflate(LayoutInflater.java:469) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:320) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.Activity.setContentView(Activity.java:1895) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.hanpfei.mymapexample.MainActivity.onCreate(MainActivity.java:12) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.Activity.performCreate(Activity.java:5133) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2293) 11-30 17:14:41.861: E/AndroidRuntime(11619): ... 11 more 11-30 17:14:41.861: E/AndroidRuntime(11619): Caused by: java.lang.RuntimeException: API key not found. Check that <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="your API key"/> is in the <application> element of AndroidManifest.xml 11-30 17:14:41.861: E/AndroidRuntime(11619): at maps.af.ay.a(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at maps.af.ay.a(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at maps.af.al.a(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at maps.af.be.a(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at maps.af.bd.a(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at cmj.onTransact(SourceFile:107) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.os.Binder.transact(Binder.java:347) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.google.android.gms.maps.internal.IMapFragmentDelegate$a$a.onCreateView(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.google.android.gms.maps.MapFragment$a.onCreateView(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.google.android.gms.dynamic.a$4.b(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.google.android.gms.dynamic.a.a(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.google.android.gms.dynamic.a.onCreateView(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at com.google.android.gms.maps.MapFragment.onCreateView(Unknown Source) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.Fragment.performCreateView(Fragment.java:1695) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:861) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1137) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.app.Activity.onCreateView(Activity.java:4746) 11-30 17:14:41.861: E/AndroidRuntime(11619): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:689) 11-30 17:14:41.861: E/AndroidRuntime(11619): ... 20 more
6. 此次是關於API key的。OK,那咱們就再遵守前文的說明,在Google APIs Console中產生一個API key加進來。這個地方多說一點,其實咱們經過eclipse已是能夠看到debug證書的SHA-1指紋了,而不須要再去執行什麼keytool。方法爲,選擇Window->Preferences->Android->Build,在SHA-1 fingerprint那一行。再次編譯並執行。
哎,咱們終於看到了期待已久的地圖了。
Done.