Google Map(谷歌地图)是Google公司提供的电子地图服务。包括了三种视图:矢量地图、卫星图片、地形地图。对于Android系统来说,可以利用Google提供的地图服务来开发自己的一些应用。Google Map的服务体现在两个方面:地图API和位置API。使用Android Maps API(地图API)和Android Location API(定位API)可以轻松实现实用而且强大的功能。

我的位置:“我的位置”在地图上显示你的当前位置(通常在 1000 米范围之内)。即使没有 GPS,你也可以确定自己的位置。谷歌手机地图还支持内置 GPS,也可以链接到蓝牙GPS 传感器,以便更准确地确定用户的位置。“我的位置”功能是通过识别你附近无线发射塔的信息广播而确定你的位置的。

       地图和卫星视图:谷歌手机地图向你提供所查看地区的地图和卫星视图,其界面的使用感觉与你在台式机上相同。 可沿其中一个方向滚动,以查看地图上的更多内容;或使用快捷键进行缩放。

       商户列表:借助于Google 的本地搜索引擎,可以按名称(如“星巴克”)或类型(如“咖啡”)搜索商家,查看商店的营业时间和评分,然后,只需点击一下即可拨通感兴趣的商家的电话。有了“我的位置”功能,甚至都不需要输入当前位置即可方便地找到附近的商家。

       驾车路线:可以很方便地获得驾车路线,其中会清楚地标明每次转弯。有了“我的位置”功能,甚至都不需要输入出发点。

       公交换乘:查看公交和地铁线路,确定转车路线,制定你在全球 80 多个城市的出行计划。“公交换乘”功能目前适用于黑莓、Windows Mobile、S60 和其他支持 Java 的手机。

       路况信息:Google 地图中的公路会根据实时路况数据,以绿色、黄色或红色显示。

       收藏夹:为你常去的地方加上书签,以便能在地图上非常方便地返回到这些地方。

1. 首先先要获取你的debug keystore位置:

打开Eclipse--->Windows---> preferences--->Android--->Build

查看默认的debug keystore位置,我的是C:\Documents and Settings\sdhbk\.android\debug.keystore

2.

D:\android-sdk-windows-1.5_r1\tools>keytool -list -alias androiddebugkey -keystore "C:\Documents and Settings\sdhbk\.android\debug.keystore" -storepass android -keypass android

androiddebugkey, 2009-7-25, PrivateKeyEntry,

认证指纹 (MD5): DA:D5:6E:C2:80:D1:0F:0D:F8:2A:58:6A:74:7C:CE:2D

3.

打开http://code.google.com/intl/zh-CN/android/maps-api-signup.html,填入你的认证指纹(MD5)即可获得apiKey了,结果显示如下:

感谢您注册 Android 地图 API 密钥!
       您的密钥是:
       XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

4. 使用得到的apiKey:

在layout中加入MapView

XML/HTML代码
  1. <com.google.android.maps.MapView
  2. android:id="@+id/mapview"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g" />

或者

XML/HTML代码
  1. <view android:id="@+id/mv"
  2. class="com.google.android.maps.MapView"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:layout_weight="1"
  6. android:apiKey="0jOkQ80oD1JL9C6HAja99uGXCRiS2CGjKO_bc_g"
  7. />

5.Android在sdk1.5的预装的add-on中提供了一个Map扩展库com.google.android.maps,利用它你就可以 给你的android应用程序增加上强大的地图功能了。这个库的位置在Your-SDK_DIR\add-ons\google_apis-3 \libs.

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

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

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

XML/HTML代码
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2. package="com.example.package.name">
  3. ...
  4. <application android:name="MyApplication" >
  5. <uses-library android:name="com.google.android.maps" />
  6. ...
  7. </application>
  8. ...
  9. </manifest>

需要说明的是这个库不是标准的android sdk的内容,你也可以自己从这里这里下载并放到你的sdk里面。

Maps库分析

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

Mapview是用来显示地图的view, 它也是派生自android.view.ViewGroup。

地图可以以不同的形式来显示出来,如街景模式,卫星模式等,具体方法可以参考:

setSatellite(boolean), setTraffic(boolean), and setStreetView(boolean)

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

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

MapActivity 是一个抽象类,任何想要显示MapView的activity都需要派生自MapActivity。并且在其派生类的onCreate()中,都要创建一 个MapView实例,可以通过MapView constructor (then add it to a layout View with ViewGroup.addView(View)) 或者通过layout XML来创建。

Google Maps实例分析

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

Step 1: 新建一个android project, 注意这里要选择的build target为"Google APIs"。

Step 2: 修改menifest文件:

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.map.prac"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  7. <uses-permission android:name="android.permission.INTERNET" />
  8. <application android:icon="@drawable/icon" android:label="@string/app_name">
  9. <uses-library android:name="com.google.android.maps" />
  10. <activity android:name=".MapViewPrac2"
  11. android:label="@string/app_name">
  12. <intent-filter>
  13. <action android:name="android.intent.action.MAIN" />
  14. <category android:name="android.intent.category.LAUNCHER" />
  15. </intent-filter>
  16. </activity>
  17. </application>
  18. <uses-sdk android:minSdkVersion="3" />
  19. </manifest>

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

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/main"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <com.google.android.maps.MapView
  7. android:id="@+id/map"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:enabled="true"
  11. android:clickable="true"
  12. android:apiKey="???????????????????????????????????"
  13. />
  14. </LinearLayout>

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

Step 4: 修改代码:

Java代码
  1. package com.map.prac;
  2. import com.google.android.maps.GeoPoint;
  3. import com.google.android.maps.MapActivity;
  4. import com.google.android.maps.MapController;
  5. import com.google.android.maps.MapView;
  6. import android.app.AlertDialog;
  7. import android.app.Dialog;
  8. import android.content.DialogInterface;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.view.KeyEvent;
  12. import android.view.Menu;
  13. import android.view.MenuItem;
  14. public class MapViewPrac2 extends MapActivity {
  15. private final String TAG = "MapPrac";
  16. private MapView mapView = null;
  17. private MapController mc;
  18. //Menu items
  19. final private int menuMode = Menu.FIRST;
  20. final private int menuExit = Menu.FIRST+1;
  21. final private int menuCommandList = Menu.FIRST + 2;
  22. private int chooseItem = 0;
  23. @Override
  24. public void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.main);
  27. mapView = (MapView)findViewById(R.id.map);
  28. mc = mapView.getController();
  29. mapView.setTraffic(true); //
  30. mapView.setSatellite(false);
  31. mapView.setStreetView(true);
  32. //GeoPoint gp = new GeoPoint((int)(39.269259 * 1000000), (int)(115.255762 * 1000000));//yixian
  33. GeoPoint gp = new GeoPoint((int)(39.95 * 1000000), (int)(116.37 * 1000000));//beijing
  34. //mc.animateTo(gp);
  35. //mc.setZoom(12);
  36. mc.setCenter(gp);
  37. //to display zoom control in MapView
  38. mapView.setBuiltInZoomControls(true);
  39. }
  40. @Override
  41. public boolean onKeyDown(int keyCode, KeyEvent event) {
  42. // TODO Auto-generated method stub
  43. Log.i(TAG,"enter onKeyDown");
  44. return super.onKeyDown(keyCode, event);
  45. }
  46. @Override
  47. public boolean onCreateOptionsMenu(Menu menu) {
  48. menu.add(0, menuMode, 0, "Map Mode");
  49. menu.add(0, menuCommandList, 1, "Command List");
  50. menu.add(0, menuExit, 2, "Exit");
  51. return super.onCreateOptionsMenu(menu);
  52. }
  53. @Override
  54. public boolean onMenuItemSelected(int featureId, MenuItem item) {
  55. // TODO Auto-generated method stub
  56. switch(item.getItemId())
  57. {
  58. case menuMode:
  59. Dialog dMode = new AlertDialog.Builder(this)
  60. //.setIcon(R.drawable.alert_dialog_icon)
  61. .setTitle(R.string.alert_dialog_single_choice)
  62. .setSingleChoiceItems(R.array.select_dialog_items2, chooseItem, new DialogInterface.OnClickListener() {
  63. public void onClick(DialogInterface dialog, int whichButton) {
  64. Log.i(TAG, "choose button is "+ whichButton);
  65. chooseItem = whichButton;
  66. }
  67. })
  68. .setPositiveButton(R.string.alert_dialog_ok, new DialogInterface.OnClickListener() {
  69. public void onClick(DialogInterface dialog, int whichButton) {
  70. Log.i(TAG,"item = "+chooseItem);
  71. switch(chooseItem)
  72. {
  73. case 0:
  74. mapView.setSatellite(false);
  75. break;
  76. case 1:
  77. mapView.setSatellite(true);
  78. break;
  79. case 2:
  80. mapView.setTraffic(true);
  81. break;
  82. case 3:
  83. mapView.setStreetView(true);
  84. break;
  85. default:
  86. break;
  87. }
  88. }
  89. })
  90. .setNegativeButton(R.string.alert_dialog_cancel, new DialogInterface.OnClickListener() {
  91. public void onClick(DialogInterface dialog, int whichButton) {
  92. }
  93. })
  94. .create();
  95. dMode.show();
  96. break;
  97. case menuCommandList:
  98. //create the dialog
  99. Dialog d = new AlertDialog.Builder(this)
  100. .setTitle(R.string.select_dialog)
  101. .setItems(R.array.select_dialog_items, new DialogInterface.OnClickListener() {
  102. public void onClick(DialogInterface dialog, int which) {
  103. String[] items = getResources().getStringArray(R.array.select_dialog_items);
  104. Log.i(TAG,"you choose is: " + items[which]);
  105. }
  106. })
  107. .create();
  108. //show the dialog
  109. d.show();
  110. break;
  111. case menuExit:
  112. finish();
  113. break;
  114. default:
  115. break;
  116. }
  117. return super.onMenuItemSelected(featureId, item);
  118. }
  119. @Override
  120. protected boolean isRouteDisplayed() {
  121. // TODO Auto-generated method stub
  122. return false;
  123. }
  124. }

关于google map的用法还有待各位Android开发人员在实际开发中的总结!

Android系统Google Maps开发实例浅析的更多相关文章

  1. 操作系统:Android(Google公司开发的操作系统)

    ylbtech-操作系统:Android(Google公司开发的操作系统) Android是一种基于Linux的自由及开放源代码的操作系统.主要使用于移动设备,如智能手机和平板电脑,由Google(谷 ...

  2. 第二章 Android系统与嵌入式开发

    第二章 Android系统与嵌入式开发 第二章首先要先了解Android和嵌入式Lnux系统有什么区别和联系,嵌入式Linux系统是在嵌入式设备中运行Linux系统:Android系统是在嵌入式设备中 ...

  3. android定位和地图开发实例

    在android开发中地图和定位是很多软件不可或缺的内容,这些特色功能也给人们带来了很多方便. 首先介绍一下地图包中的主要类: MapController : 主要控制地图移动,伸缩,以某个GPS坐标 ...

  4. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...

  5. Android Developer -- Bluetooth篇 开发实例之四 API详解

    http://www.open-open.com/lib/view/open1390879771695.html 这篇文章将会详细解析BluetoothAdapter的详细api, 包括隐藏方法, 每 ...

  6. Android Developer -- Bluetooth篇 开发实例之二 连接设备

    连接设备 In order to create a connection between your application on two devices, you must implement bot ...

  7. Android Developer -- Bluetooth篇 开发实例之一 扫描设备

    第一步:声明Bluetooth Permissions <!-- 设置蓝牙访问权限 --> <uses-permission android:name="android.p ...

  8. Android系统提供的开发常用的包名及作用

    android.app :提供高层的程序模型.提供基本的运行环境 android.content :包含各种的对设备上的数据进行访问和发布的类 android.database :通过内容提供者浏览和 ...

  9. Android Developer -- Bluetooth篇 开发实例之三 管理连接

    Managing a Connection When you have successfully connected two (or more) devices, each one will have ...

随机推荐

  1. POJ1182

    这题需要注意就是 并查集中 相对位置 注意与绝对距离区别 #include<cstdio> #define maxn 50005 int ans,i,a,b,p,fa,fb,n,k; in ...

  2. c语言变量名称与变量

    0x00030 , 0x00031 ,0x00032 ,0x00033 是四个字节,用来存放0x00010(字母a的地址)

  3. C# Process.Kill() 拒绝访问(Access Denied) 的解决方案

    需求:很多时候我们需要后台运行几个Console来不停的计算数据,那么部署到客户服务器后,如果出现突发异常,程序挂掉了,那...? 解决方案:封装了一个对后台运行程序不停监测的功能,如果发现程序有异常 ...

  4. Java web 项目 tomcat部署方式.

    本地做Java Web项目的时候常常会用到tomcat部署测试的问题, 这里介绍项目的部署方法: 1,配置文件的形式: 例如: 你的项目目录为:f:\workspaces\MyProject,此时使用 ...

  5. OpenGL中投影矩阵的推导

    本文主要是对红宝书(第八版)第五章中给出的透视投影矩阵和正交投影矩阵做一个简单推导.投影矩阵的目的是:原始点P(x,y,z)对应后投影点P'(x',y',z')满足x',y',z'∈[-1,1]. 一 ...

  6. C# 两个ListBox 数据互传-基础操作

    先看效果图: 两个服务设施列,左边:lbFacility1,右边:lbFacility2,中间向左向右箭头. 如果只是单纯的向左向右移动,那很简单. 因为项目遇到要获取选中项的ID,通过给ListBo ...

  7. 判断一个面(Polygon)是不是矩形

    判断一个面是不是矩形在GIS中很长用的功能,那么怎么判断一个面是不是矩形呢. 这里先要弄懂一些概念,面是什么,先看OGC标准的定义. 我的英文水平有限,(有翻译更好的请留言,如果翻译的准确将被采纳)大 ...

  8. [GC]一个简单的Garbage Collector的实现

    前言: 最近看了google的工程师写的一个非常简单的垃圾收集器,大概200多行C代码,感叹大牛总能够把复杂的东西通过很简单的语言和代码表达出来.为了增加自己的理解,决定把大牛的想法和代码分析一遍,与 ...

  9. 《GettingThingsDone》--GTD学习笔记(一)-GTD理论

    利用春节假期阅读了<Getting Things Done>一书,下文整理了下阅读过程中做的读书笔记和心得. ==GTD理论== 一. 目的: 1. 收集需要处理的事情把它置于一个脱离大脑 ...

  10. HDU-4616 Game 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4616 比较典型的树形DP题目,f[u][j][k]表示以点u为子树,经过 j 个陷阱的最大值,其中k= ...