Android版Google API 介绍。
通过Android版的Google API,开发者可以基于Google Map的数据开发自己的APP,API将自动连接至Google Map服务器、下载数据、显示呈现以及响应地图手势等。开发者也可以使用API添加标记(markers)、模块(polygons)、覆盖自己的基础地图(overlays to a basic map)、改变视图等。API同样提供了地理信息,方便用户与地图交互,开发者可以使用API添加如下图形:
本文档适合于Android开发者和具有面向对象概念的人阅读。
本文档可以让你对Google Maps Android API 快速入门,你可以参考相关的引用文档,查阅有关类和方法。
使用Google Map API必须要求应用中包含Google Play Services中的法律条款(Legal Notices)。法律条款可以在menu的item项中添加,也可以在“关于”项中添加。
添加法律条款的方法如下:
GoogleApiAvailability.getOpenSourceSoftwareLicenseInfo
Google Maps Android API有不错的兼容性,这种特性可以使任何应用都能使用API。
当在移动设备上使用TalkBack软件时(Talkback是一款由谷歌官方开发的系统工具软件,它的定位是帮助盲人或者有视力障碍的用户提供语言辅助。让盲人或者视力受损的用户可以非常方便的与他们的设备进行有效的互动。当使用Android自带的程序时,Talkback会实时的提供语言反馈),手指轻扫屏幕,屏幕就会从一个界面切换到另一界面,当另一界面元素获得焦点时,TalkBack会读出该元素。双击屏幕,元素就能获得焦点。
获取API key:API key是一个字符串,是连接Google servers和开发者应用的桥梁,获取API key有如下三种方式:
1)、直接复制google_maps_api.xml文件中类似于如下文本的内容到浏览器地址栏(前提是开发者注册了一个Google开发者账号):
你将获得一个128位的SHA-1编码,该编码就是API key,将API key 复制到google_maps_api.xml文件的相应位置。
2)、打开网页https://developers.google.com/maps/documentation/android/start#get-key,输入你的key和项目的包名,类似于下列方式: A1:C9:D0:AF:50:B0:4B:45:38:93:F2:AC:1D:E6:E6:D9:FF:78:F1:B6;com.googlemaptest.lenovo.googlemapdemo,通过该方式获得Google map API key。
3)、参阅下面的网页https://developers.google.com/maps/documentation/android-api/signup#overview。
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
tools:context=".MapsActivity"
android:name="com.google.android.gms.maps.SupportMapFragment" />
在activity中添加如下代码:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney, Australia, and move the camera.
LatLng sydney = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
}
}
<!-- 允许程序通过wifi或移动基站的方式获取网络粗略的经纬度信息,定位精度大概误差在30-1500米之内 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- 允许程序通过GPS芯片接收卫星的定位信息,定位精度在10米以内 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-feature android:name="android.hardware.location.gps"/> <!-- 允许程序获取模拟的定位信息(该权限可省) --> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
需要注意的是,
1、在AndroidManifest文件中,application标签的子标签中有一个标签,用于填写API key:
<meta-data
android:name="com.google.android.gms.version"
android:value="@string/google_maps_key" />
该value所引用的值就是API key,该值应在google_maps_api.xml中配置过:
<string name="google_maps_key" translatable="false" templateMergeStrategy="preserve">YOUR_KEY_HERE</string>
2、若应用所安装的设备版本是Android 6.0及以上,需要安装的Google play services SDK版本应不低于8.3。
3、以下这两个权限不必开发者手动添加,API会在需要使用这些权限时自动添加:
<!-- 获取访问网络权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- 允许当前程序获取的网络信息的权限,如,网络是否有效 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
4、同样,Google map需要3D绘制,故需要open GL ES的支持,开发者亦不必手动添加如下声明,API会在需要时自动添加:
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
创建google map实例需要两个重要的类:GoogleMap、MapFragment。
具体代码请参见上小节中的“在activity中添加源码”,其中getMapAsync方法需要运行于主线程中;在onMapReady回调方法中处理GoogleMap对象,当地图可用时,该方法将被回调,并传入一个非空的GoogleMap对象。
一旦GoogleMap对象被实例化,它将自动做如下事情:
MapFragment:
MapFragment是Fragment的子类,可将地图以fragment的形式展示在屏幕上,MapFragment实例可被当作是盛放地图的容器,另外,还可通过该类获得GoogleMap实例。
MapView:
MapView是View的子类,该View用于显示google地图,并提供了以个长方形的区域,与MapFragment类似,该类同样用于盛放地图的容器,同时利用该类创建GoogleMap实例。
应使用activity的生命周期回调方法管理GoogleMap实例,如onCreate、onResume、onPause方法等。
Google Map提供了五种地图模式:
GoogleMap map;
...
// Sets the map type to be "hybrid"
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
若将地图模式调成normal或satellite模式,放大地图,地图将展现出更多建筑物的室内信息,如机场、购物商场、大型零售店、加油站等。当缩小地图时,这些建筑的室内信息将被隐藏。如下所示:
通过API设置地图放大时的室内信息:
对地图进行初始化配置:
使用XML代码配置属性,(需使用命名空间xmlns:map=”http://schemas.android.com/apk/res-auto”):
可以在XML代码中为MapFragment和MapView这两个控件配置初始属性:
为MapFragment配置属性的方式如下(配置MapView的方式与其相同):
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
map:cameraBearing="112.5"
map:cameraTargetLat="-33.796923"
map:cameraTargetLng="150.922433"
map:cameraTilt="30"
map:cameraZoom="13"
map:mapType="normal"
map:uiCompass="false"
map:uiRotateGestures="true"
map:uiScrollGestures="false"
map:uiTiltGestures="true"
map:uiZoomControls="false"
map:uiZoomGestures="true"/>
在代码中动态设置地图属性:
为低筒动态设置属性,需使用GoogleMapOptions对象,具体操作方式如下:
GoogleMapOptions options = new GoogleMapOptions();
options.mapType(GoogleMap.MAP_TYPE_SATELLITE)
.compassEnabled(false)
.rotateGesturesEnabled(false)
.tiltGesturesEnabled(false);
若使用的是MapFragment,则为地图初始化属性的方式为MapFragment.newInstance(GoogleMapOptions options)
;
若使用MapView,则方式如下:
MapView(Context, GoogleMapOptions)
在使用地图的过程中,尽管用户可以不断变换地图的显示区域,但仍希望一些UI控制按钮(如缩放按钮、指南针、google logo等)能不随地图位置变化,一直显示在屏幕的周围。
通过GoogleMap.setPadding()方法可用于添加地图周围的控制面板,当变换地图的区域时,这些控制面板将缩小而透明;