在本机 Android 应用程序中载入 Google Maps API 网站

gongzhiyao0 2011-10-29

目录

  1. 目标
  2. 为何将 V3 网页载入本机应用程序?
  3. 工作原理
  4. 布局
  5. 管理权限
  6. 编写代码
  7. 地图
  8. 后续步骤

目标

本辅导手册适用于熟悉 Android 开发的 Java 开发人员。本辅导手册中的代码将使用 1.1 版 Android SDK 和 Google Maps API 第 3 版

完成本辅导手册的学习后,您将会获得一个应用程序,该应用程序可以载入 Google Map,并将 Android 设备提供的位置设为地图的中心。要查看本文的完整代码,请参见 Google 代码托管上的 gmaps-samples 项目。

本辅导手册并没有对 Android 开发作详尽介绍。有关 Android 使用入门的详细信息,请查看 Android 开发人员指南

为何将 V3 网页载入本机应用程序?

Android 开发环境为开发人员提供了许多优势,其中包括:

  • 对设备上本机服务(包括位置服务)的访问权限
  • 在 Android 电子市场中展示
  • 使用 Android SDK 和 Eclipse 进行快速开发

请注意,存在一个本机 Android Google Maps API。一些开发人员当然希望仅在这样的环境中进行开发。然而,对于开发服务器上承载而不是应用程序中承载的 Google Maps API 网页,这些优势非常明显。

  • 快速进行版本控制:如果将地图应用程序放在服务器上,那么,您就可以迅速地对其进行修改,而无需在 Android 电子市场中启动更新。这意味着用户无需下载和安装更新即可获得新版本的地图。因此,不管在什么时候,只要用户打开您的应用程序,就可以获得一个新地图。
  • 用户可以更加频繁地从 Google 获得新增功能和错误修正:不必等待下一个 Android 更新,Google Maps API 就可以在服务器上进行更新,而无需使用您的应用程序在每台设备上进行更新。
  • 跨平台兼容性:使用 Google Maps API,您可以创建一个可在多个平台上运行的地图。

工作原理

使用 <font face="Courier New">WebView</font> 将网页载入 Android 应用程序。实际上,<font face="Courier New">WebView</font> 会将一个浏览器嵌入到您的应用程序中。该浏览器将会显示一些控件,以供您确定载入网页的方式。通过这个嵌入的浏览器,您还可以向 Java 桥接公开一个 JavaScript,有了该 JavaScript,您就可以从 JavaScript 网页调用自己的本机 Android 应用程序中的 Java 方法了。通过此 <font face="Courier New">WebView</font>,您还可以直接从自己的 Java 应用程序中调用 JavaScript。

在创建一个新的 Android 空应用程序之后,您必须修改或创建四个基本组件才能构建自己的 <font face="Courier New">WebView</font>

  1. 您的布局。在此应用程序中,布局位于 <font face="Courier New">res/layout/main.xml</font> 文件中。
  2. Android 清单文件,可帮助您管理在设备上使用互联网和位置服务的权限。
  3. 一个用于创建和管理 WebViewactivity. 的 Java 类。
  4. 应用程序将载入的地图。

我们将会在下面的几个部分中介绍上述各个组件。

布局

布局文件可定义用户界面的组件。您需要添加 <font face="Courier New">WebView</font> 才能创建将载入网页的元素。将此元素添加到您的 <font face="Courier New">LinearLayout</font> 中:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
  <WebView android:id="@+id/webview" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"/> 
</LinearLayout>

添加将填充屏幕的 WebView 元素。请注意,<font face="Courier New"> WebView</font> 元素具有 <font face="Courier New">android:id="@+id/webview"</font> 属性。这使应用程序能够通过 ID <font face="Courier New">WebView</font> 识别 <font face="Courier New">WebView</font>

管理权限

要访问 Android 设备上的一些服务(如互联网和位置信息),应用程序必须请求相应权限。通过每个应用程序都必须具有的 <font face="Courier New">AndroidManifest.xml</font> 文件实现此权限请求。用户安装该应用程序时,设备将要求用户批准此请求。如果用户不批准此请求,那么,系统不会安装该应用程序。如果用户批准此请求,系统将会安装该应用程序,并且该应用程序可以访问所需的服务。

要授予该应用程序对互联网和位置服务的访问权限,请将以下三行添加到 <font face="Courier New">AndroidManifest.xml</font> 文件中:

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

第一行提供对互联网的访问权限,这样,您的应用程序就可以使用互联网资源了。第二行提供对设备大致位置的访问权限。这来自不同的源(具体取决于您的设备),但通常来自使用 WiFi 或 CellId 查找功能获得的大致位置。第三行提供对您的更准确位置的访问权限,通常来自设备中的 GPS。

编写代码

要将地图载入您的应用程序,请创建 <font face="Courier New">WebView </font>,让它能够使用 JavaScript,然后将网址载入网页。如果要使用位置信息,可通过 JavaScript 接口进行公开。此示例代码使用 <font face="Courier New">WebMapActivity</font> 类,该类可扩展 <a target="_blank" href="https://www.ancii.com/link/v1/pbsrIclBJAbef2_zzYFq9t5lf8xu5tsdjdpYioGYHAW1_8FCN3shRnVqTKL46I01XSOXodRkoWmGxt7NkmgzVpWgUQBW8ceXAdzjtURQlwY/" rel="nofollow" title="<font face=Courier New>Activity</font>"><font face="Courier New">Activity</font></a><font face="Courier New">Activity</font> 是基本接口,用于在 Android 应用程序中创建视觉互动。

public class WebMapActivity extends Activity { 
  private static final String MAP_URL = "http://gmaps-samples.googlecode.com/svn/trunk/articles-android-webmap/simple-android-map.html"; 
  private WebView webView; 
  @Override 
  /** Called when the activity is first created. */ 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    getLocation(); 
    setupWebView(); 
    this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
  } 
  /** Sets up the WebView object and loads the URL of the page **/ 
  private void setupWebView(){ 
    final String centerURL = "javascript:centerAt(" + 
    mostRecentLocation.getLatitude() + "," + 
    mostRecentLocation.getLongitude()+ ")"; 
    webView = (WebView) findViewById(R.id.webview); 
    webView.getSettings().setJavaScriptEnabled(true); 
    //Wait for the page to load then send the location information 
    webView.setWebViewClient(new WebViewClient()); 
    webView.loadUrl(MAP_URL); 
  }

要启用位置跟踪,您需要执行几个步骤。首先,必须从设备获取位置。<font face="Courier New">WebMapActivity </font>使用 <font face="Courier New">LocationManager</font> 获取位置。<font face="Courier New">LocationManager</font> 需要使用侦听器。在此示例中,<font face="Courier New">WebMapActivity</font> 实现 <font face="Courier New">LocationListener</font>,并充当 <font face="Courier New">LocationManager</font> 的侦听器。

public class WebMapActivity extends Activity implements LocationListener { 
  private static final String MAP_URL = "http://gmaps-samples.googlecode.com/svn/trunk/articles-android-webmap/simple-android-map.html"; 
  private void getLocation() { 
    LocationManager locationManager = 
      (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); 
    String provider = locationManager.getBestProvider(criteria,true); 
    //In order to make sure the device is getting the location, request updates. 
    locationManager.requestLocationUpdates(provider, 1, 0, this); 
    mostRecentLocation = locationManager.getLastKnownLocation(provider); 
  }

这将创建一个 <font face="Courier New">Location</font> 对象,您可以通过查询该对象来获取设备已知的最后一个位置。这样,您可以有两种选择。

  • 让应用程序直接调用网页中的 JavaScript 函数,从而通过直接调用 JavaScript 将位置信息传递到 JavaScript。
  • 您的应用程序可以向 <font face="Courier New">Location</font> 对象公开 JavaScript 接口。

centerAt 会将设备提供的位置设为地图的中心:

private void setupWebView(){ 
  final String centerURL = "javascript:centerAt(" + 
  mostRecentLocation.getLatitude() + "," + 
  mostRecentLocation.getLongitude()+ ")"; 
  webView = (WebView) findViewById(R.id.webview); 
  webView.getSettings().setJavaScriptEnabled(true); 
  //Wait for the page to load then send the location information 
  webView.setWebViewClient(new WebViewClient(){ 
    @Override 
    public void onPageFinished(WebView view, String url){ 
      webView.loadUrl(centerURL); 
    } 
  }); 
  webView.loadUrl(MAP_URL); 
}

以下示例公开了一个接口 <font face="Courier New">window.android</font>,可以通过页面中的 JavaScript 调用直接访问该接口。通过此接口,您可以有效地向网页公开内部的 Android 服务。但其缺点是通用性较差,仅当在 Android 设备上载入网页时才可用。如果您要以这种方式进行开发,最佳做法是测试 <font face="Courier New">window.android</font>,并在这些服务不可用时回退。

private void setupWebView(){ 
  final String centerURL = "javascript:centerAt(" + 
  mostRecentLocation.getLatitude() + "," + 
  mostRecentLocation.getLongitude()+ ")"; 
  webView = (WebView) findViewById(R.id.webview); 
  webView.getSettings().setJavaScriptEnabled(true); 
  //Wait for the page to load then send the location information 
  webView.setWebViewClient(new WebViewClient()); 
  webView.loadUrl(MAP_URL); 
  /** Allows JavaScript calls to access application resources **/ 
  webView.addJavascriptInterface(new JavaScriptInterface(), "android"); 
} 
/** Sets up the interface for getting access to Latitude and Longitude data from device 
 **/ 
private class JavaScriptInterface { 
  public double getLatitude(){ 
    return mostRecentLocation.getLatitude(); 
  } 
  public double getLongitude(){ 
    return mostRecentLocation.getLongitude(); 
  } 
}

地图

接下来,像往常一样创建地图。此示例代码测试 <font face="Courier New">window.android</font>(或您为 JavaScript 桥接指定的任何名称)是否存在;如果不存在,则将中心设置为 0,0。此示例还公开了 <font face="Courier New">centerAt</font> 函数,该函数允许 Android 应用程序通过 JavaScript 来设置中心:

<script type="text/javascript"  
  src="http://maps.google.com/maps/api/js?sensor=true"></script> 
<script type="text/javascript"> 
  var map; 
  function initialize() { 
    var latitude = 0; 
    var longitude = 0; 
    if (window.android){ 
      latitude = window.android.getLatitude(); 
      longitude = window.android.getLongitude(); 
    } 
    var myLatlng = new google.maps.LatLng(latitude,longitude); 
    var myOptions = { 
      zoom: 8, 
      center: myLatlng, 
      mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 
    map = new google.maps.Map(document.getElementById("map_canvas"), 
      myOptions); 
    } 
  function centerAt(latitude, longitude){ 
    myLatlng = new google.maps.LatLng(latitude,longitude); 
    map.panTo(myLatlng); 
  } 
</script>

在手机上载入地图后,地图的外观将会如下所示:

在本机 Android 应用程序中载入 Google Maps API 网站
 

后续步骤

由于您已经创建了一个基本的应用程序,因此,您现在可以利用 Android 平台提供的其他服务。例如,您可以:

  • 允许用户在其设备上存储位置或偏好设置。
  • 在地图上标出联系人所在的位置。
  • 允许用户使用加速计和罗盘移动地图。

当然,在您开发 Android 应用程序后,可以将该程序发布到 Android 电子市场

相关推荐

超算小站 / 0评论 2019-10-25