解决android使用google map时显示方格的问题

android使用google map时无法显示地图或者只显示方格(或者模拟器上显示地图真机上却显示方格)的问题主要有两个原因:

1.没有配置好mapview的使用环境;

2.没有获取正确的Maps API Key。

至于可能是其他硬件原因,不作分析。

配置好mapview的使用环境:

(1.)需要在新建项目中选中正确的Build Target选项,即Google APIs版本;
(2.)在AndroidManifest.xml配置文件中引用maps library <uses-library android:name=”com.google.android.maps” />(application标签内)以及网络访问权限<uses-permission android:name=”android.permission.INTERNET” />  
(3.)在布局文件的MapView标签属性android:apiKey中引入Maps  API Key,同时注意加上两个属性android:clickable=”true”
android:enabled=”true”。

大多数问题在于没有获取正确的Maps API Key,这会导致地图上面只显示方格而无法显示正确的地图。需要了解的是,每个android的应用程序都需要一个keystore,在调试过程中生成的apk文件就包含一个默认的debug.keystore,默认路径C:\Documents and Settings\Administrator\.android\debug.keystore,这个可以在eclipse->Windows->Preferences->Android->Build可以看到路径。

获取Maps API Key的教程,可以简单的两步实现:

1.打开http://code.google.com/intl/zh-CN/android/maps-api-signup.html页面,在windows cmd模式下,进入debug.keystore所在的目录输入keytool -list -keystore debug.keystore,输入默认的密码android,就可以在本机上获取认证指纹(MD5)。如图-1

图-1 cmd命令行获取认证指纹(MD5)

2.在上面的网页下面My certificate’s MD5 fingerprint输入框输入上面的认证指纹MD5,跳转页面可以获得Maps API Key。

上面的两个步骤是为debug.keystore获取Maps API Key。当应用程序再次发布时,需要使用新的keystore,而不是使用默认的debug.keystore,这时候需要重新获取API Key。至于如何生成新的keystore,可以参考eclipse 将android项目打包成签名的apk文件,重新获取Maps API Key,执行keytool -list -keystore debug.keystore命令时,将debug.keystore换成新生成的keystore文件,获取新Maps API Key。

上述过程就解释了模拟器上显示地图方格(没有获得正确的debug.keystore的API Key)与在真机上显示方格的两个问题(没有重新获取新的keystore文件的API Key)。采用真机调试模式连接到真机的应用程序,不需要重新获取API Key。至此,关于android使用google map时显示方格的问题得以解决。如果读者你认为还出现其他问题仍然无法显示正确的地图,可以留言讨论。

 

本文的第二部分内容就是MapView例子的使用,在google地图上实现多点标注地图的功能,并点击图标显示标注点的标题,片段等信息,如图-2。使用本例子需要再重新获取Maps API Key,否则还是会显示方格。

图-2 Mapview 地图实现多点标注功能

以下是文件源码。

1.MapViewDemoActivity .java源码

  1. package com.mapview.demo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.google.android.maps.GeoPoint;  
  7. import com.google.android.maps.ItemizedOverlay;  
  8. import com.google.android.maps.MapActivity;  
  9. import com.google.android.maps.MapController;  
  10. import com.google.android.maps.MapView;  
  11. import com.google.android.maps.Overlay;  
  12. import com.google.android.maps.OverlayItem;  
  13.   
  14. import android.graphics.drawable.Drawable;  
  15. import android.os.Bundle;  
  16. import android.widget.Toast;  
  17.   
  18. public class MapViewDemoActivity extends MapActivity {  
  19.   
  20. MapView mapView;  
  21. MapController mc;  
  22. List<Overlay> mapOverlays;  
  23. Drawable drawable;  
  24. MyItemizedOverlay itemizedOverlay;  
  25.   
  26. /** Called when the activity is first created. */  
  27. @Override  
  28. public void onCreate(Bundle savedInstanceState) {  
  29. super.onCreate(savedInstanceState);  
  30. setContentView(R.layout.main);  
  31.   
  32. // 获取mapView并设置相关属性  
  33. mapView = (MapView) findViewById(R.id.map);  
  34. // 缩放功能  
  35. mapView.setBuiltInZoomControls(true);  
  36.   
  37. // 获取地图覆盖层的List  
  38. mapOverlays = mapView.getOverlays();  
  39. // 标注图标  
  40. drawable = this.getResources().getDrawable(R.drawable.pushpin);  
  41. itemizedOverlay = new MyItemizedOverlay(drawable);  
  42.   
  43. // 定义两个地方的经纬度  
  44. Double lat = 22.534459 * 1E6;  
  45. Double lng = 113.9928 * 1E6;  
  46.   
  47. Double lat2 = 22.536387 * 1E6;  
  48. Double lng2 = 113.974507 * 1E6;  
  49.   
  50. // GeoPoint 1  
  51. GeoPoint point = new GeoPoint(lat.intValue(), lng.intValue());  
  52. OverlayItem overlayitem = new OverlayItem(point, "康佳集团""正门");  
  53.   
  54. // GeoPoint 2  
  55. GeoPoint point2 = new GeoPoint(lat2.intValue(), lng2.intValue());  
  56. OverlayItem overlayitem2 = new OverlayItem(point2, "世界之窗""广场");  
  57.   
  58. // 添加两个覆盖层并填充  
  59. itemizedOverlay.addOverlay(overlayitem);  
  60. itemizedOverlay.addOverlay(overlayitem2);  
  61. // mapview中添加itemizedOverlay  
  62. mapOverlays.add(itemizedOverlay);  
  63. //将point移至地图中间显示  
  64. mc = mapView.getController();  
  65. mc.setCenter(point);  
  66. mc.setZoom(18);  
  67. }  
  68.   
  69. @Override  
  70. protected boolean isRouteDisplayed() {  
  71. // TODO Auto-generated method stub  
  72. return false;  
  73. }  
  74.   
  75. // 定义MyItemizedOverlay类  
  76. class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {  
  77. // 定义一个OverlayItem(覆盖的层)的ArrayList  
  78. private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();  
  79.   
  80. public MyItemizedOverlay(Drawable defaultMarker) {  
  81. // 在底部中间显示  
  82. super(boundCenterBottom(defaultMarker));  
  83. // TODO Auto-generated constructor stub  
  84. }  
  85.   
  86. // 调用ArrayList的每一项(覆盖层)  
  87. @Override  
  88. protected OverlayItem createItem(int i) {  
  89. // TODO Auto-generated method stub  
  90. return mOverlays.get(i);  
  91.   
  92. }  
  93.   
  94. // 返回大小  
  95. @Override  
  96. public int size() {  
  97. // TODO Auto-generated method stub  
  98. return mOverlays.size();  
  99. }  
  100.   
  101. // 用于显示标注信息  
  102. @Override  
  103. protected boolean onTap(int index) {  
  104. OverlayItem item = mOverlays.get(index);  
  105. // 标题  
  106. String title = item.getTitle();  
  107. // 片段  
  108. String snippet = item.getSnippet();  
  109. Toast.makeText(MapViewDemoActivity.this, title + "\n" + snippet,  
  110. Toast.LENGTH_LONG).show();  
  111. return true;  
  112. }  
  113.   
  114. // 定义一个方法添加覆盖层  
  115. public void addOverlay(OverlayItem overlay) {  
  116. // 添加覆盖层  
  117. mOverlays.add(overlay);  
  118. // 填充  
  119. populate();  
  120. }  
  121. }  
  122. }  

2.main.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3. android:orientation="vertical"  
  4. android:layout_width="fill_parent"  
  5. android:layout_height="fill_parent"  
  6. android:background="#ffffff">  
  7. <com.google.android.maps.MapView android:id="@+id/map"  
  8. android:layout_width="fill_parent"  
  9. android:layout_height="wrap_content"  
  10. android:apiKey="0bICReSImsEvI16EsnPDUkwRIsqPitPYH7I5ugQ"  
  11. android:clickable="true"  
  12. android:enabled="true" />  
  13. </LinearLayout>  

AndroidManifest.xml配置文件加入:

  1. <uses-library android:name="com.google.android.maps" />  
  2.   
  3. <uses-permission android:name="android.permission.INTERNET" />  

源码下载MapViewDemo.zip

posted on 2011-12-02 14:58  ITBoB  阅读(425)  评论(0编辑  收藏  举报

导航