Android SDK:构建一个购物中心搜索的应用(一)-Mapview & Location

本文详细介绍如何利用谷歌地图API创建一个能在Android设备上显示当前位置的应用。内容涵盖获取API密钥、实现位置监听器及地图视图的配置等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本教程将探讨如何使用谷歌地图API来显示出信息点(POI),并使用手机提供的定位服务,来显示当前位置可搜索到的POI位置。这种情况下,我们应使用商场作为POI。

 

我把教程分为了两部分。
第一部分(在本节中)将介绍包括:
1.MapView对象的使用
2.使用MD5密文获取一个谷歌地图API密钥
3.实现一个地点监听器,以获得你的当前位置

第二部分将包括:
1.在应用程序中使用外部库类
2.创建显示出你的当前位置和周边的信息点

现在让我们开始吧!

步骤1:创建一个新的Android项目

启动Eclipse IDE并创建一个新的Android项目。
File > Create > New Android Project

使用以下设置创建新的项目:

项目名称:MallFinder
生成目标:Google APIs Platform–2.1  API Level 7
应用程序名:Mall Finder
包名称:com.shawnbe.mallfinder
创建Activity:MallFinderActivity
最低SDK版本:7

Step1
设置完成后,点击完成。


步骤2:在谷歌上注册获取API密钥

因为MapView对象使用谷歌地图,你需要在谷歌注册一个API密钥,并同意服务条款,然后才可以使用他们。注册过程相当简单。想要了解更多关于获得地图API密钥信息,请查看此链接

要对你的应用程序进行签名就必须要用到的MD5密文生成的API秘钥,听起来很令人困惑,但它并不难,因为你会发现它像当我们之前的几个步骤 。而不是上面的链接所述,使用命令行的方式得到你的MD5密文,我们将使用keytool的一个Eclipse插件 。想要了解更多有关keytool的插件信息,请查看此链接


步骤3:安装keytool插件

在Eclipse IDE中,导航到 Help > Install New Software。

step3

当新的窗口弹出,在窗口的顶部点击“Add”按钮。

在“Name”栏输入“keytool”(不含引号),
在“Location”栏输入“http://www.keytool.sourceforge.net/update”

step3screen2

点击“OK”。

经过短暂的加载时间,窗口将出现一个标有“keytool”的复选框。选中该复选框并单击“下一步”。同意协议的条款,然后单击“下一步”完成。

注意:在安装过程中,可能会提示您确定是否信任安全证书。如果你确定,就选中复选框并单击“确定”继续安装。
step3screen3

安装完成后,将会提示重新启动Eclipse。


步骤4:获取MD5密文

Eclipse重新启动之后,你应该看到一个新的菜单项“keytool”,它旁边有一个小钥匙图标。
step4

我们现在要打开调试的keystore。
注意:由于操作系统的位置可能会有所不同。各种操作系统的默认位置:

  • Windows Vista : C:\Users\<user>\.android\debug.keystore
  • Windows XP : C:\Documents and Settings\<user>\.android\debug.keystore
  • OS X and Linux : ~/.android/debug.keystore

    点击keytool菜单项>打开密钥库。

    点击位于“文件名”文本框右侧的“浏览”按钮,并找到keystore的位置(上述为默认位置),并选择debug.keystore文件。

    单击“打开”,选择类型“android”(不带引号),这是默认的调试密码,然后单击“Load”。
    step4screen2

现在应该在屏幕底部的面板可见一个新的keytool的标签(如果你没有看到它,导航到“Window > Open Perspective > Java Browsing”)。
step4screen3

点击debug.keystore路径左侧的小箭头将显示androiddebugkey。

双击androiddubugkey并复制MD5密文。

打开Web浏览器,进入以下网址。   http://code.google.com/android/maps-api-signup.html

阅读并同意条款,在文本框中输入MD5密文,并点击“Generate API Key”。请注意保存好你的API密钥,因为使用MapView的时候需要它。

步骤5:在布局中添加MapView

在这一步,我们将添加一个MapView到布局文件。

打开位于MallFinder > res > layout> main.xml中的main.xml文件,并修改该文件如下所示,包括一个FrameLayout和MapView:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <FrameLayout
    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:clickable="true"
        android:apiKey="PUT YOUR API KEY HERE"/>
    </FrameLayout>
</LinearLayout>

上述布局在整个可用的屏幕空间创建一个MapView。在当前状态下运行的应用程序,将导致在强制关闭。我们还需要完成多个步骤。

步骤6:设置权限,并导入所需的库

由于我们的应用程序将会从Google Maps下载数据,同时需要从手机的GPS或其他定位服务访问信息,所以我们需要在AndroidManifest文件中的声明必要的权限来使用这些服务。

要做到这一点,打开位于MallFinder > AndroidManifest.xml中的AndroidManifest.xml文件。

在关闭应用程序标记(</application>)后面,和在闭幕清单标记(</manifest>)之前添加以下几行。

<uses-feature android:name="android.hardware.location.gps"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>

在这个例子中,我不需要FINE_LOCATION,但我已经包含在此,我想你可能要调整你的代码来测试各种提供商,如果你想获得更准确的位置,你将需要FINE_LOCATION权限。通常任何生产中的应用程序都不应该声明不需要的权限。如你要求更多的权限,这是一个非常糟糕的做法,使用户警惕你的应用程序。如果你不打算使用更准确的供应商,你可以不声明android.permission.ACCESS_COARSE_LOCATION。

为了在我们的MapView中使用谷歌地图,我们需要在Manifest文件中声明该库,这样我们要在关闭活动标记和关闭应用程序标记代码之间加入下面的标签:

<uses-library android:required="true" android:name="com.google.android.maps" />
我们可以把标题栏去掉,因为我觉得这是不必要的。它使用了太多我们有限的屏幕空间。在应用程序删除标题栏添加下面代码:
android:theme="@android:style/Theme.NoTitleBar"

现在我们完整的Manifest文件看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.shawnbe.mallfinder"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="7" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar">
        <activity
            android:label="@string/app_name"
            android:name=".MallFinderActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <uses-library android:required="true" android:name="com.google.android.maps" />
    </application>
    <uses-feature android:name="android.hardware.location.gps"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.INTERNET"/>
</manifest>

步骤7:设置MapView

在我们运行MapView之前,我们还需要做一些MallFinderActivity类的调整。
打开的主要活动类(MallFinderActivity.java),这是位于:MallFinder > src > com.shawnbe.mallfinder > MallFinderActivity.java

在我们的应用程序中,我们需要将这个类继承“MapActivity”,而不是“Activity”。

修改行:

public class MallFinderActivity extends Activity {

改成:

public class MallFinderActivity extends MapActivity {

继承MapActivity类时,我们需要实现isRouteDisplayed()方法,所以我们需要添加下面的方法 :

@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

这时,我们可以启动应用程序并显示MapView,但我们的没有设置选项,如缩放级别和可见图层。我们开始在onCreate方法中声明以下变量:

private MapController mapController;
private MapView mapView;

onCreate方法中添加以下几行代码:

mapView = (MapView)findViewById(R.id.mapView);
mapView.setBuiltInZoomControls(true);
mapView.setSatellite(false);
mapView.setStreetView(true);
mapController = mapView.getController();
mapController.setZoom(13);

上面的代码只显示街层并隐藏的卫星层。我个人喜好选择它,因为我觉得在这种情况下更容易读。正如你喜欢用布尔值false和true来随意调整一样。此外,缩放级别设置为13,你也可以调整到1作为整个世界视图来看和20最大变焦。

最后,我们可以继续启动应用程序,以确保一切运行像预期一样。
有几种方法来运行应用程序,首先:

在Package Explorer window中右键单击项目 > Run as > Android Application

或者

从菜单上,单击Run > Run
step7

然后选择你的手机或模拟器。你应该可以看到一个地图覆盖整个屏幕,除了在屏幕上方的通知栏,而且可以滚动并使用缩放。
step7screen2

步骤8:获取你当前的位置

要获得你的当前位置,我们使用 locationManager类,它允许应用程序获取设备的位置。此过程可能需要一些时间来定位当前位置,因此,建议使用你lastKnownLocation,直到你可以得到一个更准确的当前的位置。

再声明以下两个变量在步骤7中:

private LocationManager locationManager;
private GeoPoint currentLocation;

此外,将以下方法添加到MallFinderActivity.java类:

public void getLastLocation(){
    String provider = getBestProvider();
    currentLocation = locationManager.getLastKnownLocation(provider);
    if(currentLocation != null){
        setCurrentLocation(currentLocation);
    }
    else
    {
        Toast.makeText(this, "Location not yet acquired", Toast.LENGTH_LONG).show();
    }
}
 
public void animateToCurrentLocation(){
    if(currentPoint!=null){
        mapController.animateTo(currentPoint);
    }
}
 
public String getBestProvider(){
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    criteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
    criteria.setAccuracy(Criteria.NO_REQUIREMENT);
    String bestProvider = locationManager.getBestProvider(criteria, true);
    return bestProvider;
}
 
public void setCurrentLocation(Location location){
    int currLatitude = (int) (location.getLatitude()*1E6);
    int currLongitude = (int) (location.getLongitude()*1E6);
    currentLocation = new GeoPoint(currLatitude,currLongitude);
 
    currentLocation = new Location("");
    currentLocation.setLatitude(currentPoint.getLatitudeE6() / 1e6);
    currentLocation.setLongitude(currentPoint.getLongitudeE6() / 1e6);
}

在onCreate方法中添加以下两行:

getLastLocation();
animateToCurrentLocation();

onCreate方法现在看起来:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mapView = (MapView)findViewById(R.id.mapView);
    mapView.setBuiltInZoomControls(true);
    mapView.setSatellite(false);
    mapView.setStreetView(true);
    mapController = mapView.getController();
    mapController.setZoom(13);
    getLastLocation();
    animateToCurrentLocation();
}

getLastLocation方法创建的locationManager类的实例,这是基于最好的供应商使用定位服务的要求。在上面的代码中,我们没有指定任何条件的供应商,但是你可以根据你的精度和功耗要求的标准来调整使用criteria.setAccuracy()和criteria.setPowerRequirement()方法。上述步骤6中,我提到,你可能需要调整你的标准,以获得更精确的的位置。如果你想做到这一点,你设置的精度标准ACCURACY_FINE的代码是:

criteria.setAccuracy(Criteria.ACCURACY_FINE);

我没有选择最精确的供应商(GPS)的原因是,因为我在室内测试此代码,并可能永远不会得到我位置。如果你能用GPS定位到当前位置,你随时可以改变准确性在外面测试它。

由于你的手机可能会使用不同的供应商指定的标准,这通常是GPS或网络(也可以是别的)。如果设置为currentLocation,最后知道的位置至少要等到我们得到了更准确和更新的位置。我们滚动围绕这些坐标为中心的地图才能发现当前位置的经度和纬度。

现在我们得到最后一个已知的位置,我们使用位置监听器来检测我们的位置变化来更新应用程序。要做到这一点,我们需要我们的类(MallFinderActivity.java)实现locationListener。首先,我们修改行:

public class MallFinderActivity extends MapActivity {

改成:

public class MallFinderActivity extends MapActivity implements LocationListener{

实现地点监听器,需要我们重写一组方法,所以我们要添加以下标准方法如下(我指的这些标准方法,实际上并不做任何事情):

@Override
public void onLocationChanged(Location arg0) {
    // TODO Auto-generated method stub
}
 
@Override
public void onProviderDisabled(String arg0) {
    // TODO Auto-generated method stub
}
 
@Override
public void onProviderEnabled(String arg0) {
    // TODO Auto-generated method stub
}
 
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
    // TODO Auto-generated method stub
}

我们将使用onLocationChanged的方法检测我们的位置更新,然后使用 setcurrentLocation方法设置为我们当前的位置。

修改onlocationChanged的方法如下:

@Override
public void onLocationChanged(Location newLocation) {
    // TODO Auto-generated method stub
    setCurrentLocation(newLocation);
}

添加以下几行代码。这些方法会在每当应用程序启动或恢复的时候,请求更新;当应用程序被暂停或关闭的同时,也将停止检查更新。

@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(getBestProvider(), 1000, 1, this);
}
 
@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

如果此时运行的应用程序的MapView应围绕你最后知道的位置,当你的手机能够定位,它将会围绕你的当前位置为中心更新。由于在步骤7设置定位的精确性,得到你的位置时间长度会有所不同。
在这一节中,我们已经学会如何使用的MapView,实现locationListener,并取得你的当前位置。在下一节中,我们将扩展包括使用外部的库来处理的MapView上信息点的覆盖和使用气球弹出窗口显示一些信息。

转载于:https://my.oschina.net/liux/blog/39601

在论坛里看到&quot;MapView和其它控件起显示 &quot; 的帖子, 那是很老的篇帖子了, 很多朋友都说无法在android SDK 1.0上运行。既然那么多人关心,我在这里就把它重写遍,顺便加入了些新的功能 ,感兴趣的朋友可以看看。 第步,当然是增加map的支持了。在Android Manifest.xml中增加以下语句: 第二步, 传说中的Layout: 然后, 创建一个MapViewActivity: public class MapViewActivity extends MapActivity { MapView mapView; MapController mapController; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); mapView = (MapView) findViewById(R.id.map); mapController = mapView.getController(); mapController.setZoom(15); updateView(); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } private void updateView(){ Double lat = 31.23717*1E6; Double lng = 121.50811*1E6; GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue()); mapController.setCenter(point); } } 好了,你的MapView上面就多了一个EditText了。 接着,我希望在MapView中增加ZoomIn和ZoomOut的功能(鄙视下Google ,缺省的MapView居然连这个功能都没有) 1. 在我们的Layout中增加段: 2. 在onCreate函数中增加: ViewGroup zoom=(ViewGroup)findViewById(R.id.zoom); zoom.addView(mapView.getZoomControls()); 现在在你的地图中点下,屏幕左下角,是不是出现了一个Zoom Table? 这才是一个最基本的地图功能嘛。 以下技巧是基于SDK 1.0的) 、申请Apikey,并放在正确的位置http://iceskysl.1sters.com/?action=show&amp;id=441 这个应该都知道,但是是申请得到的key放哪里很多人不知道,可以放在 1、XML布局文件中 申请APIkey的时候,类似命令如下: C:\Documents and Settings\Administrator\Local Settings\Application Data\Android&gt; &quot;C:\Program Files\Java\jdk1.6.0_10\bin\keytool.exe&quot; -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android androiddebugkey, 2008-9-23, PrivateKeyEntry, 认证指纹 (MD5): 1D:68:43:7C:14:2E:CC:CA:35:8B:1F:93:A7:91:AD:45 2、java中 mMapView = new MapView(this, &quot;01Yu9W3X3vbpYT3x33chPxxx7U1Z6jy8WYZXNFA&quot;); 二、记得导入uses-library 由于1.0版本的修改,使得map包不再是默认的了,使用的时候需要在manifest中的application节点下加入 否则,你将遇到可恶的&ldquo;java.lang.NoClassDefFoundError: &rdquo;,切记! 三、需要给予定的权限 因为要使用GoogleMAP的service,所以需要 如果需要GPS等应用,还需要 四、Activity需要继承自MapActivity 类似如下代码; package com.iceskysl.showmap; import com.google.android.maps.MapActivity; import android.os.Bundle; public class ShowMap extends MapActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } } 在Android中使用其提供的Sensor非常方便,如下是强制Landscape时候的情况: values[0]:方位角(水平旋转角),简单的说就是手机的头现在朝向哪个方位,0=北、90=东、180=南、270=西(可是好像不太准) values[1]:纵向旋转角,0=面朝上平置、-90=垂直向上、-180/180=面朝下平置、90=垂直向下 values[2]:橫向旋转角,0=朝前、90=往右倒、-90=往左倒 在Android中计算GPS两点间的距离/速度 Q:how to get distance between two GeoPoints in sdk 1.0 ? MapPoint.distanceSquared(MapPoint) is gone thaks!! A:you&#39;ll need to brush up on your trigonometry, and first compute the Haversine function (this is the standard way of doing it). In order to use the Java trig functions, you&#39;ll have to first convert all your angles from degrees to radians. Given two longitude/latitude pairs, and the earth&#39;s average radius (assume 6356.78km for your calculations), you can calculate the distance between the 2 points via this Java code: double EarthRad = 6356.78; // in km ! // first convert to radians... double geo1_lat = geo1.getLatitude()*java.lang.Math.PI/360; double geo1_lng = geo1.getLongitude()*java.lang.Math.PI/360; double geo2_lat = geo2.getLatitude()*java.lang.Math.PI/360; double geo2_lng = geo2.getLongitude()*java.lang.Math.PI/360; double deltaLat = java.lang.Math.abs(java.lang.Math.abs(geo2_lat) - java.lang.Math.abs(geo1_lat)); double deltaLng = java.lang.Math.abs(java.lang.Math.abs(geo2_lng) - java.lang.Math.abs(geo1_lng)); double dist = 2*EarthRad*java.lang.Math.asin(java.lang.Math.sqrt(haversine(deltaLat) + java.lang.Math.cos(pair1_lat) *java.lang.Math.cos(pair1_lng)*haversine(deltaLng))); Where &quot;dist&quot; now contains the distance between along the earth&#39;s surface. You can find the Haversine function trig equation by Googling it, then construct a method that returns the appropriate value. Computing the speed is straightforward: you know your sampling frequency, and you now know the distance between the most recent two points, so, employee speed = distance / sampling interval 参考:http://www.anddev.org/distance_between_two_geopoints_in_sdk10-t4195.html http://www.anddev.org/calculating_distance_between_two_gps_points-t3708.html 获得maps api的方法:本人的 打开Eclipse---&gt;Windows---&gt;Preferences---&gt;Android---&gt;Build 查看默认的debug keystore位置,我的是C:\Documents and Settings\Administrator\Local Settings\Application Data\Android\debug.keystore 启动命令行 直接 输入如下内容: keytool -list -alias androiddebugkey -keystore &quot;C:\Documents and Settings\Administrator\Local Settings\Application Data\Android\debug.keystore&quot; -storepass android -keypass android 结果如下:Microsoft Windows XP [版本 5.1.2600] (C) 版权所有 1985-2001 Microsoft Corp. C:\Documents and Settings\Administrator&gt;keytool -list -alias androiddebugkey -ke ystore &quot;C:\Documents and Settings\Administrator\Local Settings\Application Data\ Android\debug.keystore&quot; -storepass android -keypass android androiddebugkey, 2009-3-12, keyEntry, 认证指纹 (MD5): 0F:C3:F0:C6:32:49:CE:C6:0E:18:57:CA:48:D7:CD:12 C:\Documents and Settings\Administrator&gt; 屏幕图如下: 打开http://code.google.com/intl/zh-CN/android/maps-api-signup.html 填入你的认证指纹(MD5)即可获得apiKey了 0Ua9BENcUvNLXp8wn_vXXvVf70rLTYixrNxbHNQ http://www.androidcompetencycenter.com/category/android-api/ http://duzike.blogbus.com/logs/35386568.html http://www.helloandroid.com/node/206 http://www.diybl.com/course/6_system/linux/Linuxjs/2008819/136351.html 根据输入城市名动态加载google地图 文章出处:http://www.diybl.com/course/6_system/linux/Linuxjs/2008819/136351.html 1)SendCityName.java: package com.google.android.citygmapview; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class SendCityName extends Activity { protected static final int REQUEST_SEND_DATA = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.main); getAndSendCityName(); } public void getAndSendCityName() { Button btn = (Button)findViewById(R.id.confirm); btn.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { EditText edt=(EditText)SendCityName.this.findViewById(R.id.edt); Intent intent = new Intent(); intent.setClass(SendCityName.this, ShowGmapView.class); if(edt.getText().length()!= 0) { String data = edt.getText().toString(); String name=&quot;data&quot;; intent.putExtra(name, data); startSubActivity(intent,REQUEST_SEND_DATA); } } }); } } 说明: if(edt.getText().length()!= 0)用来处理用户输入为空的情况,为空时数据不会传递到另外一个activity中去,节省资源。 (2)ShowGmapView.java: package com.google.android.citygmapview; import java.io.IOException; import java.util.Locale; import com.google.android.location.GmmGeocoder; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.Point; import android.location.Address; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.Menu.Item; public class ShowGmapView extends MapActivity { private static final int EXIT_ID = 0; private MapView myMapView; private Address[] maddrs; protected void onCreate(Bundle icicle) { super.onCreate(icicle); setContentView(R.layout.gmap_view); Bundle extras = getIntent().getExtras(); String name=&quot;data&quot;; if(extras != null) { String data1 = extras.getString(name); GmmGeocoder mgc = new GmmGeocoder(Locale.getDefault()); try { maddrs = mgc.query(data1, GmmGeocoder.QUERY_TYPE_LOCATION, 0, 0, 180.0, 360.0); if (null!=maddrs &amp;&amp; maddrs.length &gt; 0) { Log.d(&quot;CountryName: &quot;, maddrs[0].getCountryName()); maddrs[0].getLatitude(); } else { setResult(RESULT_OK, null, extras); finish(); } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } myMapView = new MapView(this); if(null!=maddrs &amp;&amp; maddrs.length &gt; 0) { Point p = new Point((int) (maddrs[0].getLatitude() * 1000000), (int) (maddrs[0].getLongitude() * 1000000)); /** 地图控制器 */ MapController mc = myMapView.getController(); mc.animateTo(p); /** 21是最zoom in的级,共是1-21级 */ mc.zoomTo(21); setContentView(myMapView); /** 切换到卫星地图 */ myMapView.toggleSatellite(); } setResult(RESULT_OK, null, extras); } } 文章出处:http://www.diybl.com/course/6_system/linux/Linuxjs/2008819/136351.html public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_I) { /** zoom in */ myMapView.getController().zoomTo(myMapView.getZoomLevel() + 1); return true; } else if (keyCode == KeyEvent.KEYCODE_O) { /** zoom out */ myMapView.getController().zoomTo(myMapView.getZoomLevel() - 1); return true; } else if (keyCode == KeyEvent.KEYCODE_S) { /** 卫星地图 */ myMapView.toggleSatellite(); return true; } else if (keyCode == KeyEvent.KEYCODE_T) { /** traffic,路况 */ myMapView.toggleTraffic(); return true; } return false; } 文章出处:http://www.diybl.com/course/6_system/linux/Linuxjs/2008819/136351_2.html @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, EXIT_ID, R.string.exit_gmap); return true; } @Override public boolean onMenuItemSelected(int featureId, Item item) { super.onMenuItemSelected(featureId, item); switch(item.getId()) { case EXIT_ID: finish(); break; } return true; } } 说明: 在开始设计时采用了Geocoder这个类,但似乎通过它获取的经纬度为空值,所以最后采取了GmmGeocoder,并能达到目的。 图示: (3)main.xml: (4)gmap_view.xml: (5)strings.xml: city gmap view confirm Exit google map (6)AndroidManifest.xml: 文章出处:http://www.diybl.com/course/6_system/linux/Linuxjs/2008819/136351_3.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值