Android开发笔记 之Google Map
最近开始研究Android应用开发,做APKBus上面的Hello View的练习,结果做到Map View的时候卡壳了,苦苦地寻找了两天解决方法,终于成功了,特此记录,希望对他人遇到同样的问题时有帮助。
在此之前,我也参考了圣骑士Wind的博客,上面有的内容我就不重复了:
http://www.cnblogs.com/mengdd/archive/2013/01/01/2841390.html
说说我遇到的问题吧。
一、刚开始的时候不知道程序没有问题应该是怎么样的,而且这个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,不出所料地出现了错误:

这是因为上面你的 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街景吧。

浙公网安备 33010602011771号