247 views

Android使用Google Map

今天折腾了大半天,总算让Android上面的地图显示出来了,于是小记一下过程。

以前也玩过一段时间的Android,现在忘得差不多了,又是从头开始学唉。

Android应用中,如果能在其中加入Google地图,则会为你的应用增添强大的功能,目前不少LBS应用就是充分将移动跟地图结合起来。在本文中,将一步步教你如何将Google Map结合到你的Android应用中。

首先新建一个Android工程,注意必须选择Google API工程,没装的话就用Android SDK and AVD Manager去下一个SDK。

建立工程后必须要做的就是去申请Google Map API Key:

1. 找到debug.keystore,一般在C:\Users\用户名\.android\debug.keystore

2. 在cmd下执行

C:\Users\yilee>keytool -list -alias androiddebugkey -keystore C:\Users\用户名\.an
droid\debug.keystore

 

3. 提示输入keystore密码:android

3. 获得MD5密文:

androiddebugkey, 2011-7-11, PrivateKeyEntry,
认证指纹 (MD5): 70:DC:AC:FF:8D:94:F2:BA:B0:A0:XXXXX

4. 去Google Map API的主页去申请一个key就可以了。

进入http://code.google.com/intl/zh-CN/android/maps-api-signup.html输入刚才的MD5就完成了。

现在可以开始创建Android Google Map应用了。

编写Android Map的简单应用并不复杂,只需继承MapActivity类就行了。MapView这个类功能是从Google Map地图中获得数据并且展示地图。

初步的代码是这样的:

import android.os.Bundle;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;

public class MapTestActivity extends MapActivity {
   
    private MapView mapView;
   
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.map_view);
        mapView.setBuiltInZoomControls(true);
    }

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

对应的界面XML文件如下:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <com.google.android.maps.MapView
        xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map_view"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:clickable="true" android:enabled="true"
        android:apiKey="03z8l_d8elyI6wDGDf_HNHVC_5ay3_LDZTo6hBQ" />

</RelativeLayout>

到现在程序员就已经可以显示Google地图了,可以放大缩小移动。

接下来,可以为地图多增加一些自定义的功能,比如在地图上用图片进行标注。

为了实现这样的功能,我们可以继承Overlay这个类,这个类是一个基类,提供了可以在地图上添加图层的基本功能。另一个的选择是继承itemzedOverlay这个类,

它提供了一种快捷的方法,可以把标记图片和相关的文本分配给特定的地理位置。
ItemizedOverlay实例可以处理每一个OverlayItem(OverlayItem可以简单理解为在地图上的每一个标记)标记的绘制、放置、单击处理、焦点控制和布局优化。下面是代码:

package com.yilee.map;

import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();

    private Context context;

    public CustomItemizedOverlay(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
    }

    public CustomItemizedOverlay(Drawable defaultMarker, Context context) {
        this(defaultMarker);
        this.context = context;
    }

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

    @Override
    protected boolean onTap(int index) {
        OverlayItem item = mapOverlays.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(context);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();
        return true;
    }

    public void addOverlay(OverlayItem overlay) {
        mapOverlays.add(overlay);
        this.populate();
    }

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

最后修改MapTestActivity 这个类:

package com.yilee.map;

import java.util.List;
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.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

public class MapTestActivity extends MapActivity {

    private MapView mapView = null;
    private int latitudeE6 = 39949457;
    private int longitudeE6 = 116344485;
    GeoPoint point = null;
    OverlayItem overlayitem = null;
    CustomItemizedOverlay itemizedOverlay = null;

    /** Called when the activity is first created. */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.map_view);
        mapView.setBuiltInZoomControls(true);

        List<Overlay> mapOverlays = mapView.getOverlays();
        Drawable drawable = this.getResources().getDrawable(R.drawable.icon);
        CustomItemizedOverlay itemizedOverlay = new CustomItemizedOverlay(
                drawable, this);
        GeoPoint point = new GeoPoint(latitudeE6, longitudeE6);
        OverlayItem overlayitem = new OverlayItem(point, "Hello", "yilee");
        itemizedOverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedOverlay);
        MapController mapController = mapView.getController();
        mapController.animateTo(point);
        mapController.setZoom(14);

    }

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

 

上面代码实例化了CustomItemizedOverlay类,并为其构造函数传入了Android默认的Drawable类的实例进行初始化,接下来,我们用一个预先定义好的经纬度去实例化一个GeoPoint类。然后再用这个point去初始化OverlayItem对象的实例,并且传入一段文本,这样就产生了一个完整的地图上的标记了,最后把这个标记加入到图层中去,这是通过调用CustomItemizedOverlay类的addOverlay去实现的,最后该标记就会出现在Google地图上了。

最后,我们调用了MapController这个工具类去控制地图的缩放,将地图缩放到由GeoPoint类的实例指定区域的位置(使用的是animateTo方法),并用setZoom()方法指定了放大的级别。

运行程序后,可以看到在地图上只显示了指定区域大小的地图,并且看到了标记,当你点击标记时,可以看到弹出的对话框和显示的文字。

无觅相关文章插件,快速提升流量

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>