注册 Android 地图 API 密钥

本文详细介绍如何注册并使用Android地图API,包括获取API密钥、设置模拟器、集成Google Add-ons到手机终端、配置Manifest文件及MapView组件等步骤。

注册 Android 地图 API 密钥

 

运行: keytool -list -keystore ~/.android/debug.keystore

用得到的 MD5 码到 http://code.google.com/intl/zh-CN/android/maps-api-signup.html 注册 API 密钥。参考

http://www.cnblogs.com/feisky/archive/2010/01/17/1650083.html

 

注册完成后会得到如下的网页:

您的密钥是:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

此密钥适用于所有使用以下指纹所对应证书进行验证的应用程序:

XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX

下面是一个 xml 格式的示例,帮助您了解地图功能:

  <com.google.android.maps.MapView
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"                
  a ndroid:apiKey=" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "
  />

 

模拟器设置

 

建 立一个 " Google Inc.:Google APIs:3 " 的模拟器。

 

手机终端需要支持 Google Add-ons

 

作为与 Google 合作 的手机终端的制造商 , 如果想在自己的 Android 终端中集成 Google 的一些应用,例如 map market picasa sync 等,需要和 Google 签约,这样 Google 会有专人帮你将这一系列服务整合到你的平台中来。

 

作为没有和 Google 合作 的手机终端的制造商 , 我们可以使用破解的方法将 Add-ons 中的运行库整合到自己的 framework 中来( build 到手机终端的 system.img 中)。操作如下:

 

1. Android 中,额外支持 Google   Add-ons(Google Maps) ,需要将如下档案 ( 从标准的 SDK pull 出来的,也可以从 GPhone pull 出来 ) 打包进 System.img Google   Add-ons 只需要 1--2 Goolge Maps(Google 的地图程序 ) 需要 1--5

1)system/framework       com.google.android.maps.jar

2)system/etc/permissions   com.google.android.maps.xml

3)system/framework       com.google.android.gtalkservice.jar

4)system/etc/permissions   com.google.android.gtalkservice.xml

5 ) system/app           Maps.apk (Google Maps v3.0)

 

2. 源码: Android Cupcake Release( 经测试,在 donut 平台同样适用。 )

1) 编译源码 ( 为了生成 out/target 目录中 Android 最原始的东西 )

2) 将以上文件加入 out/target/product/generic 相应目录,在源码根目录使用 make snod 打包,获得新的 system.img

 

权限和 Maps 库设置

 

manifest.xml 中设置全相应的权限,比如:  

                                 

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

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

 

manifest.xml 中加上要用的 maps 库:

 

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

package="com.example.package.name">

  ...

  <application android:name="MyApplication"   >

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

    ...

  </application>

  ...

</manifest>

 

Maps 库分析

 

Maps 库提供了十几个类,具体可以参考这里 http://code.google.com/intl/ja/android/add-ons/google-apis/reference/index.html , 包括 Mapview MapController MapActivity 等。

 

1 MapController

 

控制地图移动,伸缩,以某个 GPS 坐标为中心,控制 MapView 中的 view 组件,管理 Overlay ,提供 View 的基本功能。使用多种地图模式(地图模式(某些城 市可实时对交通状况进行更新),卫星模式,街景模式)来查看 Google Map

 

常 用方法: animateTo(GeoPoint point)  setCenter(GeoPoint point)  setZoom(int zoomLevel) 等。

 

2 MapView

 

Mapview 是 用来显示地图的 view, 它派生自 android.view.ViewGroup 。当 MapView 获得焦点,可以控制地图的移动和缩放。

 

地 图可以以不同的形式来显示出来,如街景模式,卫星模式等,通过 setSatellite(boolean)  setTraffic(boolean), setStreetView(boolean) 方法。

 

MapView 只能被 MapActivity 来创建,这是因为 mapview 需要通过后台的线程来连接网络或者文件系统,而这些线程要由 mapActivity 来管理。

 

需要特别说明的一点是, android 1.5 中, map zoom 采用了 built-in 机制,可以通过setBuiltInZoomControls(boolean)来设置是否在地图 上显示 zoom 控件。

 

常用方法: getController()  getOverlays()  setSatellite(boolean)  setTraffic(boolean),   setStreetView(boolean)  setBuiltInZoomControls(boolean) 等。

 

3 MapActivity

 

管理 Activity 的生命周期,为 mapview 建立及取消对 map service 的连接。

 

MapActivity 是一个抽象类,任何想要显示 MapView activity 都 需要派生自 MapActivity 。并且在其派生类的 onCreate() 中,都要创建一个 MapView 实例,可以通过 MapViewconstructor ( 然后添加到 View ViewGroup.addView(View)) 或者通过 layout XML 来创建。

 

4 Overlay

 

Overlay 是覆盖到 MapView 的最上层,可以扩展其 ondraw 接口,自定义在 MapView 中显示一些自己的东西。 MapView 通过 MapView.getOverlays() Overlay 进行管理。

 

除了 Overlay 这个基类, Google 还扩展了 2 个比较有用的 Overlay

 

  1)MylocationOverlay —集成了 Android.location 中接收当前坐标的接口,集成 SersorManager CompassSensor 的接口

我们只需要 enableMyLocation(),enableCompass 就可以让我们的程序拥有实时的 MyLocation 以及 Compass 功能( Activity.onResume() )。

 

  2 ItemlizedOverlay —管理一个 OverlayItem 链表,用图片等资源在地图上作风格相同的标记。

 

5 Projection MapView GPS 坐标与设备坐标的转换( GeoPoint Point )。

 

一个简单的小例子

 

用一个小程序来演示一下 android 中地图功能的开发。主要 功能是实现了地图的缩放,添加了菜单,从而可以手动选择地图的显示模式等。

 

Step1: 新建一个 android project, 注意这里要选择的 buildtarget "GoogleAPIs"

 

Step 2: 修改 menifest 文件:

 

<?
xmlversion="1.0"encoding="utf-8"?>


< manifest xmlns :android ="http://schemas.android.com/apk/res/android"
package ="com.map.prac"
android :versionCode ="1"
android :versionName ="1.0" >
< uses -permission android :name ="android.permission.ACCESS_COARSE_LOCATION" />
< uses -permission android :name ="android.permission.INTERNET" />
 
   <
application
 android
:icon
="@drawable/icon"
android
:label
="@string/app_name"
>

< uses -library android :name ="com.google.android.maps" />
< activity android :name =".MapViewPrac2"
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 ="3" />
</ manifest >

 

Step 3: 修改 layout 文件, main.xml

 

<?
xmlversion="1.0"encoding="utf-8"?>

< LinearLayout xmlns :android ="http://schemas.android.com/apk/res/android"
android :id ="@+id/main"
android :layout_width ="fill_parent"
android :layout_height ="fill_parent" >
< com.google.android.maps.MapView
android :id ="@+id/map"
android :layout_width ="fill_parent"
android :layout_height ="fill_parent"
android :enabled ="true"
android :clickable ="true"
android :apiKey ="???????????????????????????????????"
/>
</ LinearLayout >

 

这里需要将 api key 中的 ???????????? 改成你自己申请到的 api key.

 

Step4: 修改代码:

package
 feisky.navigation;

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 android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends MapActivity {

// 地图显示控制相关变量定义
private MapView map=null ;
private MapController mapCon;

// 菜单项
final private int menuMode=Menu.FIRST;
final private int menuExit=Menu.FIRST+1;
private int chooseItem=0;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.main);

// 获取MapView
map=(MapView)findViewById(R.id.map);
// 设置显示模式
map.setTraffic(true );
map.setSatellite(false );
map.setStreetView(true );
// 设置可以缩放
map.setBuiltInZoomControls(true );

// 设置初始地图的中心位置
GeoPoint geoBeijing=new GeoPoint((int )(39.95*1000000), (int )(116.37*1000000));
mapCon=map.getController();
mapCon.setCenter(geoBeijing);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// 建立菜单
menu.add(0,menuMode,0,"地图模式 ");
menu.add(0, menuExit, 1, "退出 ");
return super .onCreateOptionsMenu(menu);
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super .onKeyDown(keyCode, event);
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch (item.getItemId()) {
case menuExit:
finish();
break ;
case menuMode:
Dialog dMode=new AlertDialog.Builder(this )
.setTitle("地图模式设置 ")
.setSingleChoiceItems(R.array.MapMode, chooseItem, new DialogInterface.OnClickListener()
{

@Override
public void onClick(DialogInterface dialog, int which) {
chooseItem=which;
}
})
.setPositiveButton("确定 ", new DialogInterface.OnClickListener()
{

@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
map.setSatellite(true );
//map.setTraffic(false);
//map.setStreetView(false);
break ;
case 1:
//map.setSatellite(false);
map.setTraffic(true );
//map.setStreetView(false);
break ;
case 2:
//map.setSatellite(false);
//map.setTraffic(false);
map.setStreetView(true );
break ;
default :
break ;
}
}
})
.setNegativeButton("取消 ", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int which) {

}
})
.create();
dMode.show();
break ;
default :
break ;
}
return super .onMenuItemSelected(featureId, item);
}

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

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值