Google Maps Android API V2使用及問題解決
說明
因為Google Maps的API版本更新,之前的一些教程都是關于舊版本V1的,雖然Google說繼續提供服務,但是不再提供API Key的申請。
而新的V2版本貌似改動還挺大。也沒搜到國內有什么系統介紹的博客文章之類的(書肯定是來不及那么新了)。
斷斷續續折騰了大概半個月,因為對Android也不是特別熟悉,所以碰到這樣那樣的問題。
終于在昨天看見模擬器上跑的地圖了。太感人了。
下面就主要說說要成功做成這一件事的流程吧。
因為肯定有時效性,所以打上一個時間戳:版本更新事件發生在2012年12月,而這篇博文目前的時間是2013年1月1日。
背景
一些相關的鏈接:
Google Maps Android API V1的介紹:
https://developers.google.com/maps/documentation/android/v1/mapkey?hl=zh-CN
Google Maps Android API v2的初步介紹:
https://developers.google.com/maps/documentation/android/
Introduction
https://developers.google.com/maps/documentation/android/intro
Getting Started
(本部分參考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還是需要好幾個步驟的,下面詳細說明:
獲取數字證書(digital certificate)信息
數字證書有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上創建API Project
在Google APIs Console上創建項目,并且注冊Maps API。
首先,去這個網址:https://code.google.com/apis/console/
用Gmail的賬戶登錄,如果是第一次的話,需要創建項目,默認情況會創建一個叫做API Project的項目。
點擊左邊的Services,會在中間看到很多的APIs和Services,找到Google Maps Android API v2,然后把它設置成on,需要接受一些服務條款。
獲得API Key
在左邊的導航條中選擇API Access。
在出來的頁面中選擇Create New Android Key...就可以生成key了:
然后在對話框中填入:SHA-1 指紋, 分號隔開,然后是應用的 package name.然后就會生成一個Key。
比如:
3.把API Key加入應用程序
首先,建立虛擬設備AVD和應用程序。
關于AVD,官方文檔并沒詳細介紹,我后面會有說明。
建立好應用程序,注意包名應該和申請key時候的包名一致。
之后修改AndroidManifest.xml文件:
3.1.在<application>元素中加入子標簽
- <meta-data
- android:name="com.google.android.maps.v2.API_KEY"
- android:value="your_api_key"/>
3.2.加入一些許可信息
- <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"/>
OpenGL ES V2特性支持
同樣也是作為<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"/>
然后在MainActivity.java:
- 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.main);
- }
- }
遇到的問題和解決的方法
程序編譯錯誤,顯示找不到一些類
如圖:
解決這個問題,首先需要把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。
第二步是添加對這個庫的引用:
在自己的項目上右鍵,選Properties,左邊選Android,然后在下面的Library里面Add剛才的google-play-services_lib。
之后程序就應該能運行了。
接著你可能會碰到下面的問題:
程序運行成功,但是顯示This app won't run unless you update Google Play services.
如圖:
有傳言說V2不能在AVD上運行,可能Google還會對此問題進行更新。
經過搜索,這個問題已經在Stackoverflow上被討論過了,鏈接
所以看來在AVD上運行的問題已經被解決了。
解決的方法就是在AVD上安裝兩個包:vending.apk和gms.apk,(給一個網盤鏈接)
并且AVD就選擇普通的API 16就行,不需要是Google APIs。我選的是Android4.1 API16.
安裝時把那兩個包放在當前目錄,用命令行安裝:
之后運行程序,就出地圖了: