android学习---开发Google地图应用程序

基于地图的应用程序开发是针对新款移动设备必须拥有的功能之一。为了开发Android中基于地图的应用程序,Google已经提供了地图库作为附加功能。本文阐述了地图库以及如何开发Android中基于

关于本文

基于地图的应用程序开发是针对新款移动设备必须拥有的功能之一。为了开发Android中基于地图的应用程序,Google已经提供了地图库作为附加功能。本文阐述了地图库以及如何开发Android中基于Google地图的应用程序的相关内容。

范围:

本文为希望简单了解Android编程的初学者而设计。并将逐步指导用户您开发Google地图应用程序。本文假定开发人员已安装了Android和必要的应用程序开发工具。同样假定开发人员熟悉Java或熟悉面向对象的编程概念。

如欲获取更多有关Android的详情,请参阅三星移动创新者园地(SMI)的知识库。

http://innovator.samsungmobile.com/cn/cms/cnts/knowledge.list.do?platformId=1    

简介

Android提供了Google外部地图库“com.google.android.maps”作为附加功能,以开发基于Google API的应用程序。该地图库提供了内置的地图下载、渲染和地图图片缓冲以及各种显示选项和控件。

本文假定您用户当前正在使用Eclipse IDE和已经加入其中的Android插件来开发应用程序。

安装Google API

开始开发Google地图应用程序之前,请确认您您已在Android SDK中安装了Google API插件。

外部地图库未包括在SDK中所提供的标准Android库中。Google API附加工具提供了地图库,从而可开发、建立并运行Android SDK中基于地图的应用程序。

如欲查看Google API是否已添加入Android SDK中,开启图1中所示的Android SDK和AVD管理器。

如果Google API尚未安装,则需手动对其进行安装。

选择“Installed Options(已安装选项)”部分,以查看已经安装的内容,并选择“Available Packages(可用包)”来下载附加的API.

图2显示了Google API已添加至Android SDK中。

创建项目

满足所有必要条件之后,开始开发应用程序。

首先在Eclipse IDE中创建Google地图项目,如图3中所示。给定所需的项目名称,并选择所希望的目标为Google API。使用“Google API”作为目标非常重要,因为该选项包括了可允许您使用Google地图的Google扩展件。

如果您您无法查看Google API选项,则需根据安装Google API部分的描述来进行安装。

创建带有Google API的AVD

创建项目后,您需创建可支持Google API的设备。

开启Android SDK和AVD管理器,如图1所示。选择“Virtual devices(虚拟设备)”。点击“New(新建)”按钮,创建AVD。将出现如图4所示的对话框。

指定AVD的名称,并选择“Google API(Google公司)”目标中的其中之一。配置其他选项,然后点击“Create AVD(创建AVD)”。可运行该项目的新AVD已经创建。

获取Google API注册码

Google地图库提供了渲染地图的Google地图数据。由于应用程序将访问Google数据,因此开发人员需注册Google网络服务。

Google地图API注册码要求允许Google API可相应访问能够提供地图数据的网络服务。

注册获取一个简单、免费的地图API注册码,其包括两部分:

1. 提取证书的MD5fingerprint。

2. 注册证书的MD5fingerprint。

提取MD5fingerprint 认证

如欲获注册获取一个地图API注册码,开发人员需提供MD5fingerprint 认证,这可使其用来签署应用程序。此处我们需要使用两种应用程序。

debug.keystore

默认情况下,构建工具默认在已激活的AVD目录中创建调试keystore。不同的平台,AVD目录的位置也不同:

- Windows Vista: C:\Users\\.android\debug.keystore

- Windows XP: C:\Documents and Settings\\.android\debug.keystore

- OS X和Linux: ~/.android/debug.keystorekeytool.exe

keytool.exe

您需使用随JDK安装所包含的keytool.exe应用程序来提取MD5fingerprint。该fingerprint需申请免费的Google地图注册码。该keytool.exe文件通常出现在Windows的%JAVA_HOME%/bin目录或Linux/OS X的$JAVA_HOME/bin目录中。

由于我们当前正在调试模式下开发和调试应用程序,因此我们需在调试模式下签署应用程序,即SDK构建工具将自动使用调试证书签署您的应用程序。

如欲进入该应用程序,我们需提取MD5fingerprint认证,并且为此目的需要使用debug.keystore文件。如果您无法查找debug.keystore文件,则可选择Eclipse IDE中的Windows> Preferences > Android > Build来检查路径。图5显示了Eclipse IDE中的debug.keystore路径.

一旦您已查找到keystore,则使用此Keytool命令来获取调试证书的MD5fingerprint。

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

例如: $ keytool -list -alias androiddebugkey -keystore "C:\android\debug.keystore” -storepass android -keypass android

注册证书的MD5fingerprint

keytool的输出类似于图6中所示的情况。

复制MD5证书,并打开网页浏览器至http://code.google.com/android/maps-api-signup.html

如图7中所示,同意Google API的条款和条件,并输入该证书的MD5fingerprint。

点击“Generate API Key(生成API注册码)”按钮,以生成API注册码。所生成的API注册码如图8中所示。

修改AndroidManifest.xml

现在访问应用程序中的Google地图,开发人员需要通过以下操作来修改AndroidManifest.xml文件。

添加许可

您需要使用标记元素来添加网络许可,要求的许可如下:

- android.permission.ACCESS_COARSE_LOCATION

- android.permission.ACCESS_FINE_LOCATION - android.permission.INTERNET

添加库

您需要使用标记元素来添加Google地图库。这是因为Google地图库并非是该标准库的完整部分。

最终的AndroidManifest.xml文件如图9中所示。

正如您所见,其放置于该元素以及该元素内部中元素的外部。

修改main.xml

现在打开该项目的res\layout文件夹中出现的main.xml文件。开发人员需要使用该元素来显示您的活动中的Google地图。使用元素来定位活动范围内的地图。

已修改的main.xml如图10中所示。

 

正如您所见,该Google地图API注册码已在main.xml文件中输入。

创建GoogleMap Activity

通过扩展MapActivity类而非Activity类来实现在应用程序中渲染地图。

MapActivity实际上是一种具有代码的基类,可管理能够显示MapView的任何一个Activity的繁琐事务。Activity的责任包括:

- Activity生命周期管理

- 为MapView类创建和撤销服务

为了从MapActivity进行扩展,我们必须执行isRouteDisplayed方法,该方法表示是否显示任何种类的路线信息,如交通、卫星、街道视图信息。我们将不会提供此类信息,因此这里我们仅能返回false。

请在继续之前查看Google地图API文档。该GoogleMap类如图11中所示。

部署应用程序

如欲在模拟器上部署应用程序,按下Eclipse IDE中的F11。该输出如图12中所示。

如您所见,该地图已在应用程序中予以渲染,并且可添加内置的缩放控件来缩放地图。

变更地图视图

在默认的情况下,Google地图将在地图模式下予以显示。如果您希望在卫星视图中显示该地图,则可使用MapView类的setSatellite()方法来实现,如下:

mapView.setSatellite(true);

您还可使用setStreetView()方法在街道视图中显示该地图。

mapView.setStreetView(true);

图13分别展示了卫星和街道视图中显示的Google地图。

显示特别的位置

在默认的情况下,Google地图首次加载时即可显示美国的地图。但是,您也可设置Google地图来显示一个特别的位置。在此情况下,您可使用MapController类的animateTo()方法。

如图14中所示,获取了来自MapView的一个MapController。然后,使用GeoPoint对象来表示一个地理位置。GeoPoint类位置的经纬度以微米度数(存储为整数值)来表示。

如欲将地图导航移至一个特别的位置,我们需要使用MapController类的animateTo()方法和setzoom()方法来设定缩放比例。

该输出如图15中所示。此GeoPoint坐标表示墨西哥城。

添加Overlay项目

迄今为止,我们已看到了地图,但是您可能希望创建并添加标志和停留点至地图中,从而显示名胜之地。

目前我们将添加标志至地图中。首先,我们需要显示标志的图片。复制图16,并将其添加至该项目的res/drawable文件夹中。如图17所示。

您首先需要定义一个可扩展Overlay类的类,以便添加标志至地图中:

在您必须加以定义的MapOverlay类中,重载draw()方法以便可在地图中绘制图钉图片。特别注意需要将地理位置(通过GeoPoint对象p来表示)转换成屏幕坐标。

添加标志的方法为: 创建MapOverlap类示例,并将MapOverlap类示例添加至MapView对象可用的overlays列表中。图18显示了最终代码。

该输出如图19中所示。

GoogleMap应用程序

以下显示了GoogleMap项目文件 

main.xml

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

<RelativeLayout 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:clickable="true"

        android:apiKey="YOUR API KEY HERE"/>       

</RelativeLayout>

AndroidManifest.xml

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

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

      package="com.samsung.maps.google"

      android:versionCode="1"

      android:versionName="1.0">   

      <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" android:maxSdkVersion="8" />             

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

      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">     

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

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

          <activity android:name=".GoogleMap"  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>

</manifest>

GoogleMap.java

package com.samsung.maps.google;

import java.util.List;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import com.google.android.maps.MapActivity;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

public class GoogleMap extends MapActivity  { 
 MapView mapView;
 MapController mc;
 GeoPoint p;
 Resources res;
 Context context;
 MapOverlay mapOverlay;
 
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)   {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);       
        res = getResources();
        context = getApplicationContext();       
        mapView = (MapView) findViewById(R.id.mapView);
        mapView.setBuiltInZoomControls(true);
        mc = mapView.getController();
        p = new GeoPoint(19240000,-99120000);              
        mc.animateTo(p);
        mc.setZoom(8);        
        //Add location marker
        //MapOverlay mapOverlay = new MapOverlay();
        mapOverlay = new MapOverlay(p, res, context);
        List listOfOverlays = mapView.getOverlays();
        listOfOverlays.clear();
        listOfOverlays.add(mapOverlay);        
        mapView.invalidate();
    }
 
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}

MapOverlay.java

package com.samsung.maps.google;

import android.content.Context;
import android.content.res.Resources;
import com.google.android.maps.Overlay;
import android.app.AlertDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Point;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;


public class MapOverlay extends Overlay { 
 Resources res;
 Context context;
 GeoPoint geoPoint;

 public MapOverlay(GeoPoint g, Resources r, Context c) {
  super();
  res = r;
  context = c;
  geoPoint = g;
 }

 @Override
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when)   {
        super.draw(canvas, mapView, shadow);                    
        //translate the GeoPoint to screen pixels
        Point screenPts = new Point();
        mapView.getProjection().toPixels(geoPoint, screenPts); 
        //add marker
        Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.androidmarker);           
        canvas.drawBitmap(bmp, screenPts.x, screenPts.y-58, null);        
        return true;
    }
   
    @Override
    public boolean onTap(GeoPoint p, MapView mapView) {          
      AlertDialog.Builder dialog = new AlertDialog.Builder(context);

      dialog.setTitle("Hi");

      dialog.setMessage("Hi Im in Mexico");

      dialog.show();

      return true;

    }

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值