Android平台在Android应用程序和Google Maps之间提供了轻松而紧密的集成。 引擎盖下使用了完善的Google Maps API ,以将Google Maps的功能引入您的Android应用程序。 在本教程中,我们将了解如何将Google Maps集成到Android应用中。
安装Google API
为了能够使用Google Maps,必须在您的SDK中提供Google API。 如果尚未安装Google API,则必须手动安装它们。 这是通过使用Android SDK和AVD Manager来完成的。
启动管理器,然后选择“已安装的选项”部分以查看已安装的内容,并选择“可用的软件包”以下载其他API。
您可以在以下链接中找到有关此过程的更多信息:
设置Eclipse项目
现在已经安装了适当的工具,让我们继续在Eclipse中创建一个新的Android项目。 我创建的项目名为“ AndroidGoogleMapsProject”,并具有以下配置:
使用“ Google API”作为目标很重要,因为此选项包括允许您使用Google Maps的Google扩展。 如果您的配置中没有可用的选项,请返回本教程的第一步。 我选择了平台的1.5版本,因为我们不会使用任何最新的高级API。
Google Maps API密钥生成
如您所知,如果您过去曾经使用过Google Maps API,则需要一个密钥才能使用该API。 在Android应用程序中使用的过程略有不同,因此让我们看一下需要做什么。 请注意,该过程在“ 获取Maps API密钥 ”页面中进行了描述,但我还将在此处提供描述。
首先,我们必须计算将用于签署最终申请的证书的MD5指纹。 该指纹必须提供给Google Maps API服务,以便它可以将密钥与您的应用程序关联。 Java的名为keytool的密钥和证书管理工具用于生成指纹。
keytool可执行文件位于Windows的%JAVA_HOME%/ bin目录中,对于Linux / OS X驻留在$ JAVA_HOME / bin目录中。例如,在我的设置中,它安装在“ C:\ programs \ Java \ jdk1.6.0_18 \ bin”文件夹。
在开发Android应用程序时,正在以调试模式对应用程序进行签名。 也就是说,SDK构建工具会使用调试证书自动对应用程序进行签名。 这是我们需要计算其指纹的证书。 要生成调试证书的MD5指纹,我们首先需要找到调试密钥库。 密钥库的位置因平台而异:
- Windows Vista:C:\ Users \\。android \ debug.keystore
- Windows XP:C:\ Documents and Settings \\。android \ debug.keystore
- OS X和Linux:〜/ .android / debug.keystore
现在我们已经找到了密钥库,我们可以使用keytool可执行文件通过发出以下命令来获取调试证书的MD5指纹:
keytool -list -alias androiddebugkey \
-keystore .keystore \
-storepass android -keypass android
例如,在Windows计算机中,我将目录更改为.android文件夹,并使用以下命令:
%JAVA_HOME%/ bin / keytool-列表-别名androiddebugkey -keystore debug.keystore -storepass android -keypass android
请注意,这是针对调试密钥库执行的,您将必须对将与要创建的应用程序一起使用的密钥库重复此操作。 此外,该应用程序在具有不同Android SDK密钥库的另一个开发环境上运行,该API密钥将无效并且Google Maps将无法使用。
输出将类似于以下内容:
androiddebugkey,2010年4月2日,PrivateKeyEntry,
证书指纹(MD5):72:BF:25:C1:AF:4C:C1:2F:34:D9:B1:90:35:XX:XX:XX
这是我们必须提供给Google Maps服务的指纹。 现在,我们可以通过访问Android Maps API密钥注册页面来注册密钥 。 阅读并接受条款和条件后,我们将提供生成的指纹,如下所示:
我们生成API密钥,并显示以下屏幕:
创建Google Maps应用程序
最后,是时候编写一些代码了。 将Google API附加Javadoc加入书签,以备将来参考。 集成Google Maps非常简单,可以通过扩展MapActivity类而不是通常的Activity类来实现。 主要工作由MapView执行,该MapView显示包含从Google Maps服务获取的数据的地图。 MapActivity实际上是具有代码的基类,该代码可管理显示MapView的任何活动的无聊需求。 活动职责包括:
- 活动生命周期管理
- 设置和拆卸MapView背后的服务
为了从MapActivity扩展,我们必须实现isRouteDisplayed方法,该方法指示我们是否显示任何种类的路线信息,例如一组行驶方向。 我们不会提供此类信息,因此我们仅在此处返回false。
在我们的地图活动中,我们将仅引用MapView 。 该视图将在布局XML中定义。 我们还将使用setBuiltInZoomControls方法启用内置的缩放控件。
让我们看看到目前为止我们的活动如何:
package com.javacodegeeks.android.googlemaps;
import android.os.Bundle;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
public class GMapsActivity extends MapActivity {
private MapView mapView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.map_view);
mapView.setBuiltInZoomControls(true);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
我们还要看一下引用的main.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.google.android.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/map_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:enabled="true"
android:apiKey="API-KEY-HERE" />
</RelativeLayout>
不要忘记在相关字段中提供您的API密钥,否则Google Maps将无法使用。
启动应用程序
要测试该应用程序,我们将不得不使用包含Google API的设备。 我们将使用AVD管理器来创建新设备,并将目标设置为以下一种Google API和设置:
如果现在启动Eclipse配置,我们将遇到以下异常:
java.lang.ClassNotFoundException:加载程序中的com.javacodegeeks.android.googlemaps.GMapsActivity dalvik.system.PathClassLoader@435988d0
问题是我们尚未通知Android我们希望使用基本API外部的附加Google API。 为此,我们必须在Android清单文件中使用uses-library元素,告知Android我们将使用com.google.android.maps包中的类。
另外,我们必须通过添加android.permission.INTERNET指令来授予对应用程序的Internet访问权限。 这是我们的AndroidManifest.xml文件的样子:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.javacodegeeks.android.googlemaps"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".GMapsActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:name="com.google.android.maps" />
</application>
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
这是应用程序屏幕的外观:
如果在地图内单击,将显示缩放控件,并且可以放大和缩小。
添加地图叠加
下一步是添加一些自定义地图叠加层。 为此,我们可以扩展Overlay类,该类是表示可以显示在地图顶部的叠加层的基类。 另外,我们可以扩展ItemizedOverlay ,它是Overlay的基类,该Overlay由OverlayItem的列表组成。 让我们看看我们如何做到这一点(请注意,以下示例与Android文档中的“ Hello Map View”文章非常相似):
package com.javacodegeeks.android.googlemaps;
import java.util.ArrayList;
import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;
public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();
private Context context;
public CustomItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public CustomItemizedOverlay(Drawable defaultMarker, Context context) {
this(defaultMarker);
this.context = context;
}
@Override
protected OverlayItem createItem(int i) {
return mapOverlays.get(i);
}
@Override
public int size() {
return mapOverlays.size();
}
@Override
protected boolean onTap(int index) {
OverlayItem item = mapOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;
}
public void addOverlay(OverlayItem overlay) {
mapOverlays.add(overlay);
this.populate();
}
}
我们的类在其构造函数中需要一个Android Drawable ,它将用作标记。 此外,必须提供当前上下文 。 我们使用ArrayList来存储存储在特定类中的所有OverlayItem ,因此createItem和size方法非常不言自明。 当某个项目被“点击”时, onTap方法将被调用,该方法可能是通过触摸屏幕上的Item上的触摸屏,也可以是通过单击轨迹球单击居中的选定Item来实现的。 在该方法中,我们仅创建一个AlertDialog并将其显示给用户。 最后,在公开的addOverlay方法中,我们添加OverlayItem并调用populate方法,该方法是一种实用程序方法,用于对新的ItemizedOverlay进行所有处理。
让我们看看如何通过我们的地图活动来利用此类:
package com.javacodegeeks.android.googlemaps;
import java.util.List;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
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 com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
public class GMapsActivity extends MapActivity {
private MapView mapView;
private static final int latitudeE6 = 37985339;
private static final int longitudeE6 = 23716735;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.map_view);
mapView.setBuiltInZoomControls(true);
List mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.icon);
CustomItemizedOverlay itemizedOverlay =
new CustomItemizedOverlay(drawable, this);
GeoPoint point = new GeoPoint(latitudeE6, longitudeE6);
OverlayItem overlayitem =
new OverlayItem(point, "Hello", "I'm in Athens, Greece!");
itemizedOverlay.addOverlay(overlayitem);
mapOverlays.add(itemizedOverlay);
MapController mapController = mapView.getController();
mapController.animateTo(point);
mapController.setZoom(6);
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
我们使用默认的Android图标作为Drawable创建CustomItemizedOverlay类的新实例。 然后,我们创建一个指向预定义位置的GeoPoint并将其用于生成OverlayItem对象。 我们将叠加项添加到CustomItemizedOverlay类中,它神奇地显示在地图上的预定义点上。
最后,我们的基本的参考MapController并用它使用到地图指向特定地理点animateTo方法,通过使用定义的缩放级别setZoom方法。
如果再次启动该配置,将显示一个放大的地图,其中包括指向JavaCodeGeeks家乡希腊雅典的叠加标记。 单击标记将导致弹出警告对话框,显示我们的自定义消息。
伙计们。 有关如何将Google Maps集成到您的Android应用程序的详细指南。 与往常一样,您可以下载为本教程创建的Eclipse项目 。
手机编码愉快! 别忘了分享!
相关文章:
翻译自: https://www.javacodegeeks.com/2011/02/android-google-maps-tutorial.html