【发布时间】:2014-02-23 14:41:13
【问题描述】:
我正在开发一个用于学习 Android 的简单应用。该应用程序使用国家、城市和机场名称作为过滤器查询 SQLite 数据库,并获取它的 ICAO 代码。所以应用程序查询一个网络服务(例如http://avdata.geekpilot.net/airport/SBSP.xml)来获取机场的纬度和经度坐标。
所以我试图显示我所拥有的纬度/经度的谷歌地图,但我看到的一切都是一个充满瓷砖的屏幕。
我在https://code.google.com/apis 生成了身份验证密钥。我使用 keytool 命令从 Eclipse 的 debug.keystore 文件中获取 SHA1 密钥。我将密钥放在清单和屏幕布局 xml 文件的 Mapview 部分,但我无法成功。 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>
我的代码中是否有我看不到或遗漏的内容?
【问题讨论】:
-
不要显示你的 api 密钥,秘密维护它..
-
您是否生成了 api 密钥,其中包含 android manifest 中提到的包名,即
com.cinquini.airportlocation+ sha1 密钥? -
你好 shylendra。对于那个很抱歉。我完全忘了。感谢您隐藏我的 api 密钥。是的,我在生成 api 密钥时输入了包名。
-
你有地图了吗?
-
没有。仍然是相同的行为。请看我下面的回复。天哪,我做错了什么?
标签: android eclipse google-maps runtime-error