[英]Newbee - Android app can't show google map
我正在開發一個用於研究Android的簡單應用。 該應用使用國家,城市和機場名稱作為過濾器查詢SQLite數據庫,並獲取該數據庫的ICAO代碼。 因此,該應用程序查詢網絡服務(例如http://avdata.geekpilot.net/airport/SBSP.xml )以獲取機場的緯度和經度坐標。
因此,我試圖顯示一張我所擁有的經/緯度的Google地圖,但是我看到的一切都是充滿瓷磚的屏幕。
我在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密鑰后,請不要忘記在運行應用程序之前先卸載以前的應用程序 。
並確保以下步驟正確無誤:
步驟:*確保設備具有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 Map應用了。
如果您使用最小SDK = 8創建應用程序,請使用android支持庫v4 + SupportMapFragment而不是MapFragment。
得到這個后讓我知道。
關於地圖問題,請注意,我們必須使用系統中debug.keystore文件中的SHA1指紋。 使用此名稱和應用程序的程序包名稱,我們可以生成映射密鑰。 您還可以在AndroidManifest.xml的“應用程序”部分中使用以下標記查看地圖:(如果使用的是地圖V2)。 另外,請確保您已在開發人員控制台中打開Google Android Map V2。
我希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.