Android中可以调用Google Play Service提供的GoogleMap API,在安装了AndroidSDK之后,下载GooglePlay sevices包(通过Android SDK Manager,Extras下的GooglePlay services)。Android版本的Google Maps API的Version1 (V1)现在已经不能生成APIKey,现在一般使用V2。
使用Android Google Map的服务,首先需要得到Android Google Map的API key,步骤如下:
1) 使用JDK提供的keytool找到SHA1验证码,使用命令行命令:
keytool -list -v –keystore debug.keystore,这里,keytool是jkd中的可执行文件,mystore.keystore在用户的目录(如windows下的C:\Users\user)下的.android文件夹下;
2) 将得到的SHA1码加上分号再加上app的包名,在GoogleAPIs Console中生成Android API Key;
3) 在GoogleAPIs Console中开启Google Maps API v2服务 ,具体在Services目录下;
4) 在Androidapp 的manifest文件中,一般都会加入如下权限(<manifest>标签下):
<permission
android:name="hk.cityu.picguider.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/>
<uses-permission android:name="hk.cityu.picguider.permission.MAPS_RECEIVE"/>
<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"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
另外,需要开启OpenGL的服务(<manifest>标签下):
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"/>
在<application>标签下加入APIkey:
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="你的API Key"/>
5) 布局文件:
<?xml version="1.0"encoding="utf-8"?>
<fragmentxmlns: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.SupportMapFragment"/>
6) Activity类:
public class MapMarker extends FragmentActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.map_marker);
}
}
7) 这里使用的是SupportMapFragment,因为目标是Android2.3.7(platform 10),在3.0以上(platform 11),可以使用Mapfragment,使用MapFragment可以容易加入比如将地图定位用户当前位置和指南针的功能。
8)基于API Key的Android app,在安装之后,需要联网验证API key(当前版本的Google Play,3.0.27),在此之前,地图会是空白,尽管会显示出zoom的放大和缩小的按钮;另外,如果API Key填写错误,也会出现这种状况。
9) 自定义InfoWindow地图中的Marker标志的Infowindow可以通过一个View类来设置,但是默认来说它并不是一个活动的View,这个View会被当成一个图片,因此默认来说,如果在info window中加入按钮,这个按钮的touch或者click的事件是不会触发的,因为它只是被当做一个静态的图片的一部分,解决方案有两种,一种是使用PopupWindow,但是会有一些显示问题,比如旋转时候需要自己手动改变;也可以重新定义包含MapFragment的ViewGroup,思路如下(已实现):
1. 保存一个InfoWIndowAdapter中创建的自定义的infoWindow;
2. 将MapFragment包装在自定义的ViewGroup中;
3. 覆盖自定义的ViewGroup中的dispatchTouchEvent方法,将MotionEvents首先交给InfoWidow处理,如果它并不处理这个事件,那么,调用super class 的方法处理它;
4. 在这种情况下,button的状态不会改变,就是说按下也不会显示出按下的状态(外形上),可以通过一些比较hack的方法强制改变,如在按下的时候将button的图标改 变,在松开的时候将button图标改回来。