Google Maps Android API V2使用及问题解决

说明

  由于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

  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:

复制代码
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。

      注意,导入的时候须要把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"/>
相关文章
相关标签/搜索