Android Google Maps教程

Android平台在Android应用程序和Google Maps之间提供了轻松而紧密的集成。 引擎盖下使用了完善的Google Maps API ,以将Google Maps的功能引入您的Android应用程序。 在本教程中,我们将了解如何将Google Maps集成到Android应用中。

安装Google API

为了能够使用Google Maps,必须在您的SDK中提供Google API。 如果尚未安装Google API,则必须手动安装它们。 这是通过使用Android SDK和AVD Manager来完成的。

启动管理器,然后选择“已安装的选项”部分以查看已安装的内容,并选择“可用的软件包”以下载其他API。

Android Google Maps Android SDK AVD Manager

您可以在以下链接中找到有关此过程的更多信息:


设置Eclipse项目

现在已经安装了适当的工具,让我们继续在Eclipse中创建一个新的Android项目。 我创建的项目名为“ AndroidGoogleMapsProject”,并具有以下配置:

Android Google Maps eclipse地图项目

使用“ Google API”作为目标很重要,因为此选项包括允许您使用Google Maps的Google扩展。 如果您的配置中没有可用的选项,请返回本教程的第一步。 我选择了平台的1.5版本,因为我们不会使用任何最新的高级API。

Google Maps API密钥生成

如您所知,如果您过去曾经使用过Google Maps API,则需要一个密钥才能使用该API。 在Android应用程序中使用的过程略有不同,因此让我们看一下需要做什么。 请注意,该过程在“ 获取Maps API密钥 ”页面中进行了描述,但我还将在此处提供描述。

首先,我们必须计算将用于签署最终申请的证书的MD5指纹。 该指纹必须提供给Google Maps API服务,以便它可以将密钥与您的应用程序关联。 Java的名为keytool的密钥和证书管理工具用于生成指纹。

keytool可执行文件位于Windows的%JAVA_HOME%/ bin目录中,对于Linux / OS X驻留在$ JAVA_HOME / bin目录中。例如,在我的设置中,它安装在“ C:\ programs \ Java \ jdk1.6.0_18 \ bin”文件夹。

在开发Android应用程序时,正在以调试模式对应用程序进行签名。 也就是说,SDK构建工具会使用调试证书自动对应用程序进行签名。 这是我们需要计算其指纹的证书。 要生成调试证书的MD5指纹,我们首先需要找到调试密钥库。 密钥库的位置因平台而异:

  • Windows Vista:C:\ Users \\。android \ debug.keystore
  • Windows XP:C:\ Documents and Settings \\。android \ debug.keystore
  • OS X和Linux:〜/ .android / debug.keystore

现在我们已经找到了密钥库,我们可以使用keytool可执行文件通过发出以下命令来获取调试证书的MD5指纹:

keytool -list -alias androiddebugkey \
-keystore .keystore \
-storepass android -keypass android

例如,在Windows计算机中,我将目录更改为.android文件夹,并使用以下命令:

%JAVA_HOME%/ bin / keytool-列表-别名androiddebugkey -keystore debug.keystore -storepass android -keypass android

请注意,这是针对调试密钥库执行的,您将必须对将与要创建的应用程序一起使用的密钥库重复此操作。 此外,该应用程序在具有不同Android SDK密钥库的另一个开发环境上运行,该API密钥将无效并且Google Maps将无法使用。

输出将类似于以下内容:

androiddebugkey,2010年4月2日,PrivateKeyEntry,
证书指纹(MD5):72:BF:25:C1:AF:4C:C1:2F:34:D9:B1:90:35:XX:XX:XX

这是我们必须提供给Google Maps服务的指纹。 现在,我们可以通过访问Android Maps API密钥注册页面来注册密钥 。 阅读并接受条款和条件后,我们将提供生成的指纹,如下所示:

Android Google Maps Fingerprint

我们生成API密钥,并显示以下屏幕:

Android Google Maps API

创建Google Maps应用程序

最后,是时候编写一些代码了。 将Google API附加Javadoc加入书签,以备将来参考。 集成Google Maps非常简单,可以通过扩展MapActivity类而不是通常的Activity类来实现。 主要工作由MapView执行,该MapView显示包含从Google Maps服务获取的数据的地图。 MapActivity实际上是具有代码的基类,该代码可管理显示MapView的任何活动的无聊需求。 活动职责包括:

  • 活动生命周期管理
  • 设置和拆卸MapView背后的服务

为了从MapActivity扩展,我们必须实现isRouteDisplayed方法,该方法指示我们是否显示任何种类的路线信息,例如一组行驶方向。 我们不会提供此类信息,因此我们仅在此处返回false。

在我们的地图活动中,我们将仅引用MapView 。 该视图将在布局XML中定义。 我们还将使用setBuiltInZoomControls方法启用内置的缩放控件。

让我们看看到目前为止我们的活动如何:

package com.javacodegeeks.android.googlemaps;

import android.os.Bundle;

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

public class GMapsActivity 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;
    }

}

我们还要看一下引用的main.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="API-KEY-HERE" />

</RelativeLayout>

不要忘记在相关字段中提供您的API密钥,否则Google Maps将无法使用。

启动应用程序

要测试该应用程序,我们将不得不使用包含Google API的设备。 我们将使用AVD管理器来创建新设备,并将目标设置为以下一种Google API和设置:

Android Google Maps创建新的AVD

如果现在启动Eclipse配置,我们将遇到以下异常:

java.lang.ClassNotFoundException:加载程序中的com.javacodegeeks.android.googlemaps.GMapsActivity dalvik.system.PathClassLoader@435988d0

问题是我们尚未通知Android我们希望使用基本API外部的附加Google API。 为此,我们必须在Android清单文件中使用uses-library元素,告知Android我们将使用com.google.android.maps包中的类。

另外,我们必须通过添加android.permission.INTERNET指令来授予对应用程序的Internet访问权限。 这是我们的AndroidManifest.xml文件的样子:

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.javacodegeeks.android.googlemaps"
      android:versionCode="1"
      android:versionName="1.0">

    <application android:icon="@drawable/icon" android:label="@string/app_name">

        <activity android:name=".GMapsActivity"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

      <uses-library android:name="com.google.android.maps" />

    </application>

    <uses-permission android:name="android.permission.INTERNET"/>

</manifest>

这是应用程序屏幕的外观:

Android Google地图

如果在地图内单击,将显示缩放控件,并且可以放大和缩小。

添加地图叠加

下一步是添加一些自定义地图叠加层。 为此,我们可以扩展Overlay类,该类是表示可以显示在地图顶部的叠加层的基类。 另外,我们可以扩展ItemizedOverlay ,它是Overlay的基类,该OverlayOverlayItem的列表组成。 让我们看看我们如何做到这一点(请注意,以下示例与Android文档中的“ Hello Map View”文章非常相似):

package com.javacodegeeks.android.googlemaps;

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
   public int size() {
      return mapOverlays.size();
   }

   @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();
   }

}

我们的类在其构造函数中需要一个Android Drawable ,它将用作标记。 此外,必须提供当前上下文 。 我们使用ArrayList来存储存储在特定类中的所有OverlayItem ,因此createItemsize方法非常不言自明。 当某个项目被“点击”时, onTap方法将被调用,该方法可能是通过触摸屏幕上的Item上的触摸屏,也可以是通过单击轨迹球单击居中的选定Item来实现的。 在该方法中,我们仅创建一个AlertDialog并将其显示给用户。 最后,在公开的addOverlay方法中,我们添加OverlayItem并调用populate方法,该方法是一种实用程序方法,用于对新的ItemizedOverlay进行所有处理。

让我们看看如何通过我们的地图活动来利用此类:

package com.javacodegeeks.android.googlemaps;

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 GMapsActivity extends MapActivity {

    private MapView mapView;

    private static final int latitudeE6 = 37985339;
    private static final int longitudeE6 = 23716735;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mapView = (MapView) findViewById(R.id.map_view);       
        mapView.setBuiltInZoomControls(true);

        List 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", "I'm in Athens, Greece!");

        itemizedOverlay.addOverlay(overlayitem);
        mapOverlays.add(itemizedOverlay);

        MapController mapController = mapView.getController();

        mapController.animateTo(point);
        mapController.setZoom(6);

    }

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

}

我们使用默认的Android图标作为Drawable创建CustomItemizedOverlay类的新实例。 然后,我们创建一个指向预定义位置的GeoPoint并将其用于生成OverlayItem对象。 我们将叠加项添加到CustomItemizedOverlay类中,它神奇地显示在地图上的预定义点上。

最后,我们的基本的参考MapController并用它使用到地图指向特定地理点animateTo方法,通过使用定义的缩放级别setZoom方法。

如果再次启动该配置,将显示一个放大的地图,其中包括指向JavaCodeGeeks家乡希腊雅典的叠加标记。 单击标记将导致弹出警告对话框,显示我们的自定义消息。

Android Google地图

伙计们。 有关如何将Google Maps集成到您的Android应用程序的详细指南。 与往常一样,您可以下载为本教程创建的Eclipse项目

手机编码愉快! 别忘了分享!

相关文章:

相关片段:

翻译自: https://www.javacodegeeks.com/2011/02/android-google-maps-tutorial.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值