好了,不说废话了,开始我们的google map编程吧。
1:必须下载google Map扩展库,下载方式是通过AVD,跟你下载最新SDK一样,具体就不说了。
2:申请Android Map API Key:
在命令行下进入其路径地址,进入到:C:\Users\用户名\.android下:然后 输入
keytool -list -v -keystore debug.keystore ,这时它一般会提示你输入密码,默认的密码是android, 你输入android,如果完整输入android后,没有显示也没有关系,按回车即可,这样就把三种指纹证书全部列出来了,包括MD5、SHA1、SHA256。(密钥口令是android)
,后显示证书指纹如下:
3:记下认证指纹,接着去往 http://code.google.com/android/maps-api-signup.html,
在复选框上打钩后,输入你的认证指纹,然后点击Generate API Key,这时你就申请到了你的key,当然前提是你必须登录。(您可能需要一个google账号或者注册过google市场),
申请Google Maps API 时需要验证MD5指纹证书,那么我们就在文本框中输入MD5证书(注意是MD5,而不是SHA1等)
如图:
生成的key为:
好了,既然有了Key,那么就来开始编码了.步骤如下:
1:新建项目,选中Google apis.
2:必须在 AndroidManifest.xml 文件中声明: <uses-library android:name="com.google.android.maps"/>
3:当然了,我们需要访问网络,或者也需要WIFI定位等,那么就加入些权限吧。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
4:新建布局文件,并添加:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.google.android.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="0XfqXJAIPzqeUtU7mTM2PQDwplHCFk93iAglI0w" android:clickable="true"> </com.google.android.maps.MapView> </LinearLayout>
5:然后定义activity继承MapActivity,这里我们可以定义菜单,分别切换不同的地图模式:街道、卫星、交通等。
这里我们需要了解3个对象: MapView 显示地图 MapController 控制地图,当然最重要的是怎么定位地图一个点,根据初中地理可知道,使用经纬度可以定义地球任意一点,这里需要用到google API的GeoPoint对象。
下面是代码:
package com.dongzi; import android.content.Context; import android.location.Location; import android.location.LocationManager; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.Window; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; /** * location api和map api结合起来,通过location api定位,然后在map api中显示地图: * @author Lenovo * */ public class GooglemapDemoActivity extends MapActivity { private static final String Tag=GooglemapDemoActivity.class.getName(); private MapView mapView=null; private MapController mapController=null; int latitudeE6=39*1000000; int longitudeE6=116*1000000; int zoomLevel=12; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); mapView = (MapView) findViewById(R.id.mapView); //设置街道模式,可放大 mapView.setStreetView(true); //mapView.setTraffic(true);mapView.setSatellite(false); mapView.setBuiltInZoomControls(true); //获得map控制器 mapController=mapView.getController(); mapController.setZoom(zoomLevel); //默认定位到北京经纬度 GeoPoint gpoint=new GeoPoint(latitudeE6, longitudeE6); //默认显示北京经纬度 mapController.animateTo(gpoint); } @Override protected boolean isRouteDisplayed() { return false; } @Override public boolean onCreateOptionsMenu(Menu menu){ super.onCreateOptionsMenu(menu); menu.add(0, 0, 0, "街道"); menu.add(0, 1, 0, "交通"); menu.add(0, 2, 0, "卫星"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ super.onOptionsItemSelected(item); switch(item.getItemId()){ case 0: //显示街道图 mapView.setStreetView(true); mapView.setTraffic(false); mapView.setSatellite(false); break; case 1: //显示交通图 mapView.setStreetView(false); mapView.setTraffic(true); mapView.setSatellite(false); break; case 2: //显示卫星图 mapView.setStreetView(false); mapView.setTraffic(false); mapView.setSatellite(true); break; default:break; } return true; } //根据地位API获得当前经纬度并返回GeoPoint对象,提供与地图API private GeoPoint getCurrentGeoPoint(){ LocationManager locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE); Location location=locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); return new GeoPoint((int)(location.getLatitude()*1e6),(int)(location.getLongitude()*1e6)); } }
当然,我们还必须使用地位API,根据手机当前位置获得经纬度,然后在地图中显示。
注意,我们可以把我们手机默认语言设置为中文,这样显示路线的时候才会是中文
运行程序如图:
google map api包中最重要的几个类。
1、MapActivity:这个类是用于显示Map的Activity类,它需要连接底层网络。
2、MapView:是用于显示地图的View组件,它必须和MapActivity配合使用。
3、MapController:用于控制地图的移动。
4、Overlay:这是一个可显示于地图之上的可绘制的对象。
5、GeoPoint:一个包含经纬度位置的对象。
Android Location API 关于定位功能的比较重要的类:
1、LocationManager:本类提供访问定位服务的功能,也提供获取最佳定位提供者的功能。另外,临近警报功能。
2、LocationProvider:该类是定位提供者的抽象类。定位提供者具备周期性报告设备地理位置的功能。
3、LocationListener:提供定位信息发生改变时的回调功能。必须事先在定位管理器中注册监听器对象。
4、Criteria:该类使得应用能够通过在LocationProvider中设置的属性来选择合适的定位提供者。
那么怎么获得本机的经纬度呢?我们可以使用GPS传感器,