Google Maps Android API V2的使用及問題解決


 

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"/>

  其中your_api_key置換成自己申請的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。

  (如果沒有這個庫請在Android SDK Manager更新,在底端的Extras里面更新Google Play services)。

 

第二步是添加對這個庫的引用:

  在自己的項目上右鍵,選Properties,左邊選Android,然后在下面的Library里面Add剛才的google-play-services_lib。

  

  之后程序就應該能運行了。

  

  如果你的Eclipse中不是設置為自動build,則需要build一下google-play-services_lib這個項目。也可以選Project-Clean..

  直到google-play-services_lib中的gen路徑下生成了需要的包,這樣引用才不會出錯

 

  接着你可能會碰到下面的問題:

 

程序運行成功,但是顯示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 StoreGoogle 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"/>

  

 

再次補充說明(2013/3/9)

  很榮幸,有很多朋友在本博文下留言提問。

  但是有點抱歉的是,我也只是個初學者,很多問題我也不太懂,只是根據我的想法提出一些建議。

  如果你的問題我沒有回復,那么就說明我不知道怎么解答,見諒。

  我是很希望能回答每一個人的問題的,但是有些我真的也不知道怎么回答,因為也比較忙,也沒有時間把各種版本的AVD都試一試,最近關於Map開發的一些事也擱置了下來,所以關於API也沒有多做什么深入研究。

 

  下面是一些提問,以及我通常會給出的答案:

  1.關於Key的生成:

  生成Key的時候需要用到SHA-1指紋以及應用的包名。所以換了電腦或者重新創建項目之后都要重新申請Key。

  另外這個Key也分Debug和Release兩種,文中只討論了Debug版本的Key。

  可以參見原鏈接,得到更詳細的解答:https://developers.google.com/maps/documentation/android/start

  2.庫的添加

  google_play_services這個庫的添加可以解決一些找不到類的問題。

  當發生錯誤是ClassNotFoundException,並且是找不到com.google.android.gms這個包中的類時,請檢查google_play_services庫的添加。

  3.包的安裝

  文中給出的兩個包(Google Play Store和Google Play services的apk包)只是我實驗的時候成功的版本,注意特定的AVD版本:Android4.1 API16,和特定的時間:2013年1月1日。

  關於這個問題的更多討論可以參見:http://stackoverflow.com/questions/13691943/this-app-wont-run-unless-you-update-google-play-services-via-bazaar

  這個上面有不同版本的對應的包,畢竟不同設備好像不太一樣。

  或者直接Google一下你的問題,其實可以得到很多很靠譜的解答的。

  另外,因為各種版本升級問題等,我給的安裝包可能需要升級,隨着時間的改變,Android的API以及Google Play Store和Google Play services都在升級,需要一些不同的嘗試吧。

  也歡迎各位把自己實驗成功的API版本和安裝包版本分享一下。

  4.APIs的使用

  關於Google Maps Android API v2的進一步使用,可以參見官方文檔:https://developers.google.com/maps/documentation/android/

  我也沒用過v1,所以關於怎么對應的問題我也不知道。

  關於定位不准或者API使用的問題,我也不懂了,盡量找時間研究吧,到時候會新發博文。

  要學習的東西太多了,我得提高效率了。

  各位祝好!

  
   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM