Android开发笔记 之Google Map

最近开始研究Android应用开发,做APKBus上面的Hello View的练习,结果做到Map View的时候卡壳了,苦苦地寻找了两天解决方法,终于成功了,特此记录,希望对他人遇到同样的问题时有帮助。

在此之前,我也参考了圣骑士Wind的博客,上面有的内容我就不重复了:

http://www.cnblogs.com/mengdd/archive/2013/01/01/2841390.html

官方指引:https://developers.google.com/maps/documentation/android/start#installing_the_google_maps_android_v2_api

说说我遇到的问题吧。

一、刚开始的时候不知道程序没有问题应该是怎么样的,而且这个Map view有不同的写法,APKBus上面的 google Map V1是一种,但是这种已经不被建议了。

二、另外参考了Google 官方的写法及圣骑士Wind的写法

因此我一共建了三个项目,在此只以Google官方写法为例。

首先是Layout文件,相对于Map View,google更建议用Fragment:

1 <?xml version="1.0" encoding="utf-8"?>
2 <fragment xmlns:android="http://schemas.android.com/apk/res/android"
3     android:id="@+id/map"
4     android:name="com.google.android.gms.maps.MapFragment"
5     android:layout_width="fill_parent"
6     android:layout_height="fill_parent" >
7 </fragment>

然后是Activity的Java文件,在写了下面的代码之后会提示GoogleMap和MapFragment找不到,这时候要添加google-play-services_lib

第一步是引入google-play-services_lib这个项目:

  在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。

引入后代码就没有错了。

 1 package com.alexwong.whereru;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 
 6 import com.google.android.gms.maps.GoogleMap;
 7 import com.google.android.gms.maps.MapFragment;
 8 
 9 public class MainActivity extends Activity {
10     private GoogleMap mMap;
11 
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16 
17         mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
18                 .getMap();
19         setUpMapIfNeeded();
20 
21     }
22 
23     @Override
24     protected void onResume() {
25         super.onResume();
26         // In case Google Play services has since become available.
27         setUpMapIfNeeded();
28     }
29 
30     private void setUpMapIfNeeded() {
31 
32         // Do a null check to confirm that we have not already instantiated the
33         // map.
34         if (mMap == null) {
35             mMap = ((MapFragment) getFragmentManager().findFragmentById(
36                     R.id.map)).getMap();
37 
38             // check if we were successful in obtaining the map
39             if (mMap != null) {
40             }
41 
42         }
43     }
44 
45 }

接下来是manefest.xml文件:

首先加入permission许可权限作为manifest的子结点,把com.example.hellogooglemap3换成你的package名字

    <permission
        android:name="com.example.hellogooglemap3.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

然后是加入OpenGL,也是作为manifest的子结点

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

最后在<Activity>后面,把google map API Key V2 作application的子结点:

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="你的 API Key" />

OK!!!万事俱备,只欠东风!做了这么多步骤,先试着运行一下吧。Activity已经运行了,地图背景也有了,放大缩小的+/-号也有了,就是地图没有具体显示出来。

查看LogCat,不出所料地出现了错误:

LogCat

这是因为上面你的 API Key的地方需要把自己的google API Key值放进去。

什么是Google API Key呢?简单来说,相当于是你的App的身份证。对于Android上运行的app,Google要求所有app都要注册(sign),注册就需要fingerprint。准确来说这个fingerprint才是App的身份证,但是Google为不同的开发者提供了不同的认证策略。比如说对于不同的App,但都是你开发的,你可以用同一个fingerprint给它们注册(sign),这样的话可能这些程序的package是不同的,或者你希望这些程序可以共享一些东西。这时候,就可以在google的API console上面控制了,也就是生成同一个Google API Key。

Google API Key = fingerprint+ ";" + package

如下图所示:

可以几个Apps对应同一个API Key(用不同的行表示)如上图。值得一提的是这个package要注意,要把名字写全,不然的话是匹配不了的,

像中间那个对于hellogooglemap3这个app是用不了的.

当App向google API请求服务的时候,google会拿certificate和包名去匹配,成功了才会让app连接google server。

关于如何得到certificate 的fingerprint(两种,debug和release的),以及申请Google API的详细步骤,请参考圣骑士和Google官方的链接(上面)。

(注意:在google APIs console上添加了package甚至生成了API Key之后,马上加入程序的manifest文件不一定马上生效,可以偿试刷新一下google APIs console页面和重启下eclipse)

至此,google地图的接口能用了,玩一下3D街景吧。

Map

 

posted on 2013-04-11 23:42  嘿!老板  阅读(439)  评论(1)    收藏  举报