Google Map API v2 步步为营(一) ----- 初见地图
官方文档:https://developers.google.com/maps/documentation/android/start?hl=zh-CN
先谷歌后百度。使用google的api基本上按照官网来就好了,开发过程中遇到各种各样的问题,其实仔细看官方文 都能找到解决方法的。这篇文主要是让自己回顾总结一下。
Google Map API v2 相对v1变化了不少,千万别拿着v1的攻略做v2。
step1 准备工作:
1,需要安装两个东西,Google Play services SDK 和 Google APIs。
打开Android SDK Manager,拖到最底下找到Extras文件夹,展开,找到Google Play services,安装。
Google Play services 将安装到android SDK path下,我的目录是~/develop/android-sdk-linux/extras/google/google_play_services/
我用的是API 15(4.0.3),到对应的目录下展开,安装Google APIs。
2,导入Google Play services
File > Import, 选择Android > Existing Android Code into Workspace,找到
~/develop/android-sdk-linux/extras/google/google_play_services/libproject/google-play-services_lib/。
导入之后在eclipse里就能看到google-play-services_lib工程,如果eclipse里设置了build automatically,就会自动编译,要确保gen目录下有生成com.google.android.gms这个包,否则后面的步骤会报错。
3,按正常步骤建立自己的android project,把google-play-services_lib加入到Dependencies的库中。
在左边的Package Expolorer视窗中找到自己的project,鼠标右键,选择Properties,左边导航栏选Android,右边子窗口里找到Library,点Add,打开project selection窗口,选择google-play-services_lib,点Ok。
加入后
点OK。
回到工作区,包目录下可以看到多了两个dependence的包
4,调试环境
手机上需要安装Google服务包(com.google.android.gms.apk)和Google Play Store(com.android.vending.apk)。
我没装google服务的framework,play store其实是用不了的,但是并不影响Google Map的使用。
如果使用模拟器,创建AVD的时候 target选择对应API level的Google APIs就行了。
准备工作结束。
step 2 申请KEY
使用google的东西都必须申请一个KEY,这个KEY是和 APK的包名 及 打apk包时所用的证书 绑定的。
1,先安装keytool
eclipse->Help->Install New Software,点Add,Name填写Keytool,Loction填http://www.keytool.sourceforge.net/update ,安装完成重启eclipse,菜单栏上多了Keytool菜单。
2,找到证书的SHA1
调试阶段通过eclipse的run和debug打包的apk,都是使用默认的debug证书,这个证书的位置在home目录的.android目录下。
eclipse->Keytool->Open keystore,文件路径输入/home/用户名/.android/debug.keystore,密码是debug证书的默认密码android
打开后窗口底部出现keytool视窗,列出刚刚选择的keystore,展开,双击打开androiddebugkey,找到SHA1 Fingerprint 复制下来。
也可以通过命令行查看key,keytool的命令行操作参考http://docs.oracle.com/javase/6/docs/technotes/tools/windows/keytool.html
3, 登陆Google APIs Console,创建KEY
用gmail账号登陆https://code.google.com/apis/console/?noredirect,新建一个project,左边导航视窗中选择Services,第一次加载可能会比较慢。
加载完后,右边窗口会出现google提供的所有服务,找到Google Maps Android API v2,把后面的trigger设置成ON,然后出现的各种协议选择accept。
导航视窗中选择API Access。点击按钮Create Android Key,弹出窗口中填写 “SHA1;包名”,create成功,返回API Access窗口就能看到Key for Android apps,把API key栏的一串字符复制下来。
step 3 可以开始codding了
1,修改manifest
回到eclipse,打开AndroidManifest.xml,在<manifest>根节点中设置地图访问许可
<!-- google map needed --> <permission android:name="com.xxx.xxx.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> <uses-permission android:name="com.xxx.xxx.permission.MAPS_RECEIVE"/> <!-- google map needed -->
com.xxx.xxx是包名,注意这两句要加在<application></application>外面
其他需要的许可
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 精确位置服务 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 位置服务 --> <uses-permission android:name="android.permission.INTERNET"/> <!-- 网络服务 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!-- 查询网络状态 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 写sd卡 google地图会往sd卡上写缓存数据--> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> <!-- 允许访问google的web服务 -->
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
申明要使用OpenGL ES,这一项是为了让不支持OpenGL的机器访问play store的时候略过这个apk。不写这一项也不影响调试。
在<application></application>节点中增加两个元数据:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="@string/GOOGLE_MAP_API_KEY"/>
res/values/config.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string translatable="false" name="GOOGLE_MAP_API_KEY">上一步中复制出来的API KEY</string> </resources>
GOOGLE_MAP_API_KEY 的值就是step 2.3中申请的key。
2,MapsActivity.java
layout/map.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 3 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 > 7 <fragment 8 android:id="@+id/map_view" 9 android:layout_width="match_parent" 10 android:layout_height="match_parent" 11 android:name="com.google.android.gms.maps.MapFragment"/> 12 13 <RelativeLayout android:id="@+id/debug" 14 android:layout_width="wrap_content" 15 android:layout_height="wrap_content" 16 > 17 18 <TextView android:id="@+id/debug_loc_marked" 19 android:layout_width="wrap_content" 20 android:layout_height="wrap_content" 21 android:textColor="#f00" 22 android:text="debug_loc_marked" 23 android:layout_marginTop="0dip" /> 24 25 <TextView android:id="@+id/debug_loc_my" 26 android:layout_width="wrap_content" 27 android:layout_height="wrap_content" 28 android:textColor="#f00" 29 android:text="debug_loc_my" 30 android:layout_below="@id/debug_loc_marked" /> 31 </RelativeLayout> 32 </FrameLayout>
重点在7~11行,v2的地图是用Fragment来显示的
13~31行是两个用于调试的textview,显示标记所在的经纬度,及当前位置经纬度。
MapsActivity.java
先给一个简化版
public class MapsActivity extends Activity{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.map); } }
OK,run一下
本篇结束。上图中mark和地址获取需要额外的代码,下一篇进阶篇中再继续整理。