【问题标题】:Newbee - Android app can't show google mapNewbee - Android 应用无法显示谷歌地图
【发布时间】: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


【解决方案1】:

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

并确保以下步骤正确与否:

步骤: * 确保设备有 Google Play services APK * 安装 Google Play 服务版本。 2个以上

  • https://code.google.com/apis/console/创建项目
  • 启用“Google Maps Android API v2”
  • 在 API 控制台注册项目中的 SHA1(现在,您需要 WRITE SHA1;your.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 APIs V2 创建您自己的 Google Map 应用了。

如果您创建应用的最低 SDK = 8,请使用 android 支持库 v4 + SupportMapFragment 而不是 MapFragment。

收到后告诉我。

【讨论】:

  • 你好 shylendra。我做了你提到的每一步,但没有成功。现在我在 LogCat 收到另一条错误消息:'02-24 09:41:29.621: E/MapActivity(655): Couldn't get connection factory client 02-24 09:41:33.056: W/System.err( 655): IOException 处理: 26 02-24 09:41:33.061: W/System.err(655): java.io.IOException: 服务器返回: 3'
【解决方案2】:

关于地图问题,请注意我们必须使用系统中 debug.keystore 文件中的 SHA1 指纹。使用这个和应用程序的包名,我们可以生成映射键。 您还可以在 AndroidManifest.xml 的应用程序部分中使用以下标记来查看地图:(如果您使用的是地图 V2)。还要确保您已在开发者控制台中开启 Google Android Map V2。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多