本笔记将学习如何使用Google Map服务。主要参考来源为:https://developers.google.com/maps/documentation/android/start?hl=zh-CN。要在模拟器和实际手机上跑通还是费了一番周折。最新的Google Maps Android API v2已经将map服务合并到Google Play services中,但是国内手机并不提供Google Play store,也不提供Google Play services。国内的手机是否不需要进行CTS测试?换言之,本次学习对于在国内市场提供应用并没有实际意义,因为你不可能要求用户去进行额外的安装,但是将学习手机应用如何使用互联网服务。要在手机上跑Google地图服务,涉及的步骤比较多。
一、准备开发环境
1、在Eclipse上安装Google Play Services SDK。位于extra,见下图。安装后位于sdk/extras/google/google_play_services/
2、安装SDK后,将Make a copy of the Google Play services的lib project拷贝到我们的workspace中,目的是为了在我们的project中可以引入该lib。在Eclise中File -> Import, 选择Android -> Existing Android Code into Workspace, 在SDK安装的目录下,选择该lib(google-play-services_lib),将其import。
3、要使我们的project可以使用google play service lib,是通用的将library project加入到Android project的操作,目地为了在开发的应用中使用来自lib project的共享代码。在Eclipse的包浏览(一般位于左侧)中,选择我们的项目,按右键-> Properties -> 在左边属处选择Android,在右边选择Library -> 在Project Selection 对话框中点击Add -> 从可选的lib project中选择目标。如下图
二、准备调测环境
无论采用模拟器还是真实手机作为调测环境,需要确保设备已经安装com.android.vending.apk(Google play store)和com.google.android.gms.apk(Google play services),然而模拟器上并没有包括这两个包,而国内手机也不包含着两个apk,这就是为何我在篇首感叹。要安装这个两个需要在网上进行search。需要注意com.google.andriod.gms.apk在2013年5月30有update。由于和Google在线提供的服务相关,这个包必须是最新,才能匹配现有的在线服务。在代码中可能进行检测:
GooglePlayServicesUtil.isGooglePlayServicesAvailable ( getApplicationContext() )
如果返回ConnectionResult: SUCCESS表示可以正常使用。其他可能返回有SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID。下面左图是SERVICE_MISSING,右图是SERVICE_VERSION_UPDATE_REQUIRED的情况,都不能正常使用Map业务。上面虽然有两个button,实际不起作用,估计是无法连接到服务器导致。据说小米手机的应用商店可以跳转到Google Play,可能小米和Google达成某些协议,可能小米手机上没有什么问题。
要安装这个apk时最为麻烦的。最后的解决办法是先在模拟器上先安装华为的智汇云,在上面查找这两个应用。由于应用来源不正规,所以不建议在真实手机上安装。模拟器上安装apk没有网上说的那么复杂,要进入adb shell处理。在模拟器上的浏览器直接打开相关的网页,下载apk,然后点击进行安装即可,和手机安装没区别。安装成功后,可以看到App增加了Google Settings和Play Store两个。
还有一个更为简单的方法。用gmail帐号登录,然后找到应用下载,在那里可以下载Google Map,官方版本比较安全。
2013.9.5补充:在模拟器上使用Google Map。我们下载了Google API后,为了确保这些API能在模拟器上正常使用,在创建AVD时,我们应该选择Google API来进行创建Target,就可以在模拟器中加入相关的功能,如下图所示,不需要额外去下载。
三、获取Google Map API的key
要通过Google Map API访问Google在线的地图服务,需要Google Map API Key。这个Key获取是免费的,开发者只要具有Gmail的邮箱就可。所有的Android app都必须由数字证书签发,开发者持有私有private key。由于数字证书是唯一的,作为应用的唯一标识,这是的应用商店可追踪你的应用,以及追踪你应用使用了Google Map服务。
Maps API key是基于应用的数字证书,也成为SHA-1 fingerprint。分为debug证书和release证书,对于我们的试验,使用debug。debug keystore文件位于~/.android/,如果是Windows位于C:\Users\your_user_name\.android\。Linux和用下面命令获得证书。在Windows中-keystore的参数为"C:\Users\your_user_name\.android\debug.keystore"。
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
记录下证书指纹,用它在Google APIs Console获取Map Key。Google API Console需要用Google帐号进行登录,也就是我们Gmail的帐号,这个网站貌似不是很稳定,有时请求需要发送多次才能成功,可能有间歇性拦截,反正多给点耐心吧。
OK,成功获取我们的Google Map API Key。
四、使用Google Map服务
经过以上步骤,终于将整个开发环境准备好,进入代码编写阶段。在coding的具体编写前,首先要AndroidManifest.xml中设置相应的许可,具体如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wei.android.beginning" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />
<!-- 步骤(1)设置Google Map API v2 Key,其中com.wei.android.beginning为package的名字 -->
<permission android:name="com.wei.android.beginning.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
<uses-permission android:name="com.wei.android.beginning.permission.MAPS_RECEIVE"/>
<!-- 步骤(3)设置使用Google Map服务所需的许可 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- Google Map是互联网业务,允许互联网 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 允许API检查网络连接状态,已确定是否可以下载数据 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 允许将Google地图数据缓存在SD卡上 -->
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/><!-- 允许API访问Google的基于Web的业务 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 地图应用经常和定位相关,允许粗定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 允许精确定位-->
<!-- 步骤(4)Google Map v2需要OpenGL ES,需要用uses-feature中声明 -->
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<application ...... >
<!-- 步骤(2)设置Google Map API v2 Key -->
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyDPOviDLcwanPb3D3rwdqYXFn8jikGXey0"/>
<activity ......> ...... </activity>
</application>
</manifest>
使用最为简单的的例子,在Activitiy中简单的显示提出。在Activitiy引用的layout.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"
- android:name="com.google.android.gms.maps.MapFragment"/>
只要在activity中,将该布局引入即可。
- public class MainActivity extends Activity {
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- }
费了好大劲,要show一下成果。显示经度为0,维度为0的地区,请看非洲……
相关链接: 我的Android开发相关文章