Newbee - Android应用程序无法显示谷歌地图

时间:2014-02-23 14:41:13

标签: android eclipse google-maps runtime-error

我正在开发一个用于学习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>

我的代码中是否有我无法看到或丢失的内容?

2 个答案:

答案 0 :(得分:1)

一旦使用清单中提到的软件包名称重新生成api密钥,请不要忘记在运行应用程序之前卸载以前的应用程序

确保以下步骤正确无误:

步骤: *确保该设备具有Google Play服务APK *安装Google Play服务版。超过2

enter image description here

  • https://code.google.com/apis/console/
  • 创建项目
  • 启用“Google Maps Android API v2” enter image description here
  • 在API控制台注册项目中的SHA1(现在,你需要写SHA1;你的.app.package.name )并获取API KEY
  • 将目录ANDROID_SDK_DIR / extras / google / google_play_services / libproject / google-play-services_lib复制到项目的根目录
  • 将下一行添加到YOUR_PROJECT / project.properties

android.library.reference.1=google-play-services_lib

  • 将下一行添加到YOUR_PROJECT / proguard-project.txt

-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。

我希望这会有所帮助