我正在开发一个用于学习Android目的的简单应用。该应用程序使用国家,城市和机场名称作为过滤器查询SQLite数据库,并获取其ICAO代码。因此,该应用会查询网络服务(例如http://avdata.geekpilot.net/airport/SBSP.xml)以获取纬度和广度机场的经度坐标。
所以我试图展示我所拥有的lat / lon的Google地图,但我看到的一切都是一块满是瓷砖的屏幕。
我在https://code.google.com/apis生成了身份验证密钥。我使用keytool命令从Eclipse的debug.keystore文件中获取SHA1密钥。我把密钥放在清单上,并在Mapview部分的屏幕布局xml文件中,但我不能成功。 logcat始终显示包含以下消息的顺序警告:
02-23 10:46:48.856: W/System.err(6359): IOException processing: 26
02-23 10:46:48.856: W/System.err(6359): java.io.IOException: Server returned: 3
02-23 10:46:48.856: W/System.err(6359): at android_maps_conflict_avoidance.com.google.googlenav.map.BaseTileRequest.readResponseData(BaseTileRequest.java:115)
02-23 10:46:48.856: W/System.err(6359): at android_maps_conflict_avoidance.com.google.googlenav.map.MapService$MapTileRequest.readResponseData(MapService.java:1473)
02-23 10:46:48.856: W/System.err(6359): at android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher.processDataRequest(DataRequestDispatcher.java:1117)
02-23 10:46:48.856: W/System.err(6359): at android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher.serviceRequests(DataRequestDispatcher.java:994)
02-23 10:46:48.856: W/System.err(6359): at android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher$DispatcherServer.run(DataRequestDispatcher.java:1702)
我在教程中看到我应该使用MD5密钥,但是当我使用它时,Google会向我显示一条消息,通知密钥无效。我只能在使用SHA1时获取身份验证密钥。
我在我的项目中引用了google-play-services_lib.jar和maps.jar,并且没有在Java Build Path的Order and Export选项卡上检查它们。
我的班级
public class ShowMapActivity extends MapActivity {
private MapView map;
private Double latitude = 0.0;
private Double longitude = 0.0;
private MyLocationOverlay me = null;
@SuppressLint("NewApi")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
Intent mapCall = getIntent();
latitude = (Double) mapCall.getDoubleExtra(
TestDatabaseActivity.LATITUDE, 0);
longitude = (Double) mapCall.getDoubleExtra(
TestDatabaseActivity.LATITUDE, 0);
map = (MapView) findViewById(R.id.mMap);
final MapController mapController = map.getController();
mapController.setCenter(getPoint(latitude,longitude));
map.setBuiltInZoomControls(true);
Drawable marker=getResources().getDrawable(R.drawable.pushpin_red);
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());
map.getOverlays().add(new SitesOverlay(marker));
me = new MyLocationOverlay(this, map);
map.getOverlays().add(me);
}
private GeoPoint getPoint(double lat, double lon) {
return(new GeoPoint((int)lat, (int)lon));
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
private class SitesOverlay extends ItemizedOverlay<OverlayItem> {
private List<OverlayItem> items=new ArrayList<OverlayItem>();
public SitesOverlay(Drawable marker) {
super(boundCenterBottom(marker));
populate();
}
@Override
protected OverlayItem createItem(int i) {
return(items.get(i));
}
@Override
protected boolean onTap(int i) {
Toast.makeText(ShowMapActivity.this,
items.get(i).getSnippet(),
Toast.LENGTH_SHORT).show();
return(true);
}
@Override
public int size() {
return(items.size());
}
}
}
ActivityMap(布局屏幕)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.google.android.maps.MapView android:id="@+id/mMap"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:apiKey="my api key here"
android:clickable="true" />
</RelativeLayout>
清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cinquini.airportlocation"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="19" />
<permission
android:name="com.cinquini.airportlocation.permission.MAPS_RECEIVE"
android:protectionLevel="signature"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-feature android:glEsVersion="2" android:required="true"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.Holo" >
<uses-library android:name="com.google.android.maps" />
<activity
android:name="com.cinquini.airportlocation.TestDatabaseActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.cinquini.airportlocation.ShowMapActivity"
android:label="@string/title_activity_map" >
</activity>
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="my api key here"/>
</application>
</manifest>
我的代码中是否有我无法看到或丢失的内容?
答案 0 :(得分:1)
一旦使用清单中提到的软件包名称重新生成api密钥,请不要忘记在运行应用程序之前卸载以前的应用程序。
确保以下步骤正确无误:
步骤: *确保该设备具有Google Play服务APK *安装Google Play服务版。超过2
android.library.reference.1=google-play-services_lib
-keep class * extends java.util.ListResourceBundle {
protected Object[][] getContents();
}
好的,现在您已准备好使用适用于Android的Google Map API V2创建自己的Google地图应用。
如果使用min SDK = 8创建应用程序,请使用android支持库v4 + SupportMapFragment而不是MapFragment。
得到这个后告诉我。
答案 1 :(得分:0)
关于地图问题,请注意我们必须使用系统中debug.keystore文件中的SHA1指纹。使用这个和应用程序的包名称,我们可以生成map键。 您还可以使用AndroidManifest.xml的Application部分中的以下标记来查看地图:(如果您使用的是地图V2)。另外,请确保您已在开发者控制台中启用Google Android Map V2。
我希望这会有所帮助