Android中配置和使用Google Map服务

Android提供了对地图服务强有力的支持,开发一款基于地图服务的软件也因此变得容易了许多,今天就和大家分享一下如何在Android中配置和使用Google Map服务。

首先我们需要找到调试证书,它由Eclipse生成和维护。点击Eclipse中的Window=>Preferences,然后找到Android=>Build项,如图:

被鼠标选中的路径就是开发时默认的调试证书文件。我们在下面要用到此路径。

然后我们需要使用Android提供的keytool命令获取指定调试证书所对应的MD5指纹码:

keytool -list -alias androiddebugkey -keystore "C:/Users/user/.android/debug.keystore" -storepass android -keypass android

  

需要注意的是,调试储存库的alias为“androiddebugkey”,密钥库密码为“android”,私钥密码也为“android”。

使用以上命令,我们就可以获取MD5指纹码了。如图所示:

拿到了MD5指纹码之后,我们需要到向google请求map-api密钥。我们需要在浏览器中输入以下地址:

http://code.google.com/intl/zh-CN/android/maps-api-signup.html

然后输入刚才我们获取到的MD5指纹码。如图所示:

如果我们没有登录google账户的话,它会提示我们先登录google账户。

最后,如果响应页面如图,就代表申请成功了:

android:apiKey就是我们申请到的map-api密钥。

完成了这些步骤之后,我们就能开发自己的应用程序了。

首先我们需要新建一个项目,在建立项目的过程中,Build Target一定要选择“Google APIs”这一项,如图:

项目结构如图所示:

这个示例主要完成以下功能:显示地图界面;定位天安门并显示到到屏幕中央;使用mark.png为天安门做标记。

MainActivity.java代码如下:

package com.scott.map;

import android.graphics.drawable.Drawable;
import android.os.Bundle;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;

public class MainActivity extends MapActivity {

	private MapView mapView;
	private static final double latitude = 39.908716;
	private static final double longitude = 116.397529;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mapView = (MapView) findViewById(R.id.mapView);
        //启用内建的缩放控制器
        mapView.setBuiltInZoomControls(true);
        //启用点击事件处理
        mapView.setClickable(true);
        
        //获取标记图片
        Drawable marker = getResources().getDrawable(R.drawable.mark);
        //设置边界
        marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());
        //创建自定义图层实例
        LocationOverlay locations = new LocationOverlay(marker);
        //添加自定义图层
        mapView.getOverlays().add(locations);
        
        //以指定纬度和经度建立一个GeoPoint实例
        GeoPoint point = new GeoPoint((int)(latitude * 1E6),(int)(longitude * 1E6));
        //设置缩放级别
        mapView.getController().setZoom(17);
        //将指定的点移动到中央位置
        mapView.getController().animateTo(point);
    }

	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}
}

  

需要注意,我们必须继承com.google.android.maps.MapActivity,因为MapView必须和MapActivity结合才能使用地图服务。

在MainActivity中,我们用到了LocationOverlay,它是用来在地图上做图层标记的,LocationOverlay.java代码如下:

package com.scott.map;

import java.util.ArrayList;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.drawable.Drawable;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.OverlayItem;

public class LocationOverlay extends ItemizedOverlay<OverlayItem> {

	private List<OverlayItem> locations = new ArrayList<OverlayItem>();
	private Drawable marker;

	public LocationOverlay(Drawable defaultMarker) {
		super(defaultMarker);
		//保存标记图片
		marker = defaultMarker;
		//以指定纬度和经度建立一个GeoPoint实例
		GeoPoint point = new GeoPoint((int)(39.908716 * 1E6),(int)(116.397529 * 1E6));
		//添加一个图层项
		locations.add(new OverlayItem(point, "target", "target"));
		
		//调用父类方法 放置标记
		populate();
	}
	
	@Override
	public void draw(Canvas canvas, MapView mapView, boolean shadow) {
		super.draw(canvas, mapView, shadow);
		//以图片的底部居中方式放置标记图片
		boundCenterBottom(marker);
	}

	@Override
	protected OverlayItem createItem(int i) {
		return locations.get(i);
	}

	@Override
	public int size() {
		return locations.size();
	}

}

  

布局文件/res/layout/main.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <com.google.android.maps.MapView
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:enabled = "true"
        android:apiKey="刚才申请到的apiKey值"
    />
</FrameLayout>

最后别忘了配置AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.scott.map"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <!-- 使用com.google.android.maps类库 -->
        <uses-library  android:name="com.google.android.maps" />
        <activity android:name=".MainActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-sdk android:minSdkVersion="8" />
    <!-- 以下权限都是地图服务要用到的 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
</manifest> 

上面的工作都做完之后,我们就要在模拟器中运行了,我们需要新建一个支持Google APIs的模拟器,如图:

然后就可以运行我们的例子了,我们运行的结果如图:

好了,今天先介绍到这里,以后有时间和大家分享一下地图服务的高级应用。

posted @ 2016-03-13 11:56  znyyjk  阅读(268)  评论(0编辑  收藏  举报