【问题标题】:Blank GoogleMap on a real Android 2.3 device with Google API (Lv. 17)带有 Google API 的真实 Android 2.3 设备上的空白 GoogleMap(Lv. 17)
【发布时间】:2013-03-25 13:08:34
【问题描述】:

问题说明,请先阅读本文

我正在尝试获取我的简单应用程序,该应用程序将显示在 Android 2.3 到 Android 4.0+ 设备上运行的用户位置。 地图不会显示在真正的 Android 2.3 设备上。

该应用目前可以在 Android 4.0+ 设备上按照我的需要运行和显示地图,没有任何问题。

因为它可以在Android 4.0+上正常显示地图,所以我认为问题应该不是Google Maps V2的设置或权限有问题。

但是,当我在 Android 2.3 设备上尝试时,地图区域将是一个空白,如下图所示:

该应用使用 ActionBarSherlock、Google Maps API v2 和 SupportMapFragment。针对 SDK 17 构建,最低 SDK 10。


代码片段

我粘贴并修剪了代码以显示唯一相关的部分,如果您需要其他任何内容,请发表评论。

activity_layout.xml

<fragment
    android:id="@+id/map"
    android:name="com.google.android.gms.maps.SupportMapFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="@dimen/incident_padding_right" />

Activity.java

import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMarkerDragListener;
import com.google.android.gms.maps.SupportMapFragment;

public class Activity extends SherlockFragmentActivity{

private static GoogleMap map;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_layout);

            ............

        //Set up map view
        map = ((SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map)).getMap();

            ............

        OnMarkerDragListener markerDragListener = new OnMarkerDragListener() {

            @Override
            public void onMarkerDragStart(Marker marker) {
                // Called when the marker drag is started

            }

            @Override
            public void onMarkerDragEnd(Marker marker) {
                // Called when the marker is dropped down.
                coords[0] = marker.getPosition().latitude;
                coords[1] = marker.getPosition().longitude;
                RestoreUIwithSavedLocation(coords);
                Log.d(TAG, "Pin Dropped at: " + coords[0] + ", " + coords[1]);
            }

            @Override
            public void onMarkerDrag(Marker marker) {

            }
        };

        map.setOnMarkerDragListener(markerDragListener);
}

在真正的 Android 2.3 设备上运行时的 Logcat:

01-04 21:16:52.020: D/dalvikvm(19074): VFY: dead code 0x0014-0018 in Lcom/google/android/gms/common/GooglePlayServicesUtil;.b (Landroid/content/res/Resources;)Z
01-04 21:16:52.150: W/dalvikvm(19074): Unable to resolve superclass of Lmaps/p/s; (427)
01-04 21:16:52.150: W/dalvikvm(19074): Link of class 'Lmaps/p/s;' failed
01-04 21:16:52.150: W/dalvikvm(19074): Unable to resolve superclass of Lmaps/y/bo; (3820)
01-04 21:16:52.150: W/dalvikvm(19074): Link of class 'Lmaps/y/bo;' failed
01-04 21:16:52.150: W/dalvikvm(19074): Unable to resolve superclass of Lmaps/i/k; (4208)
01-04 21:16:52.150: W/dalvikvm(19074): Link of class 'Lmaps/i/k;' failed
01-04 21:16:52.150: E/dalvikvm(19074): Could not find class 'maps.i.k', referenced from method maps.z.ag.a
01-04 21:16:52.150: W/dalvikvm(19074): VFY: unable to resolve new-instance 3540 (Lmaps/i/k;) in Lmaps/z/ag;
01-04 21:16:52.150: D/dalvikvm(19074): VFY: replacing opcode 0x22 at 0x006d
01-04 21:16:52.160: D/dalvikvm(19074): VFY: dead code 0x006f-007f in Lmaps/z/ag;.a (Landroid/view/LayoutInflater;Lcom/google/android/gms/maps/GoogleMapOptions;ZLjava/lang/String;)Lmaps/z/ag;

使用 Google API Lv.10 在模拟器上运行时的 logcat

03-25 13:00:47.974: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:47.992: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:47.992: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:48.002: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:48.002: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:48.022: W/GooglePlayServicesUtil(751): Google Play services is missing.
03-25 13:00:48.072: D/AndroidRuntime(751): Shutting down VM
03-25 13:00:48.072: W/dalvikvm(751): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-25 13:00:48.133: E/AndroidRuntime(751): FATAL EXCEPTION: main
03-25 13:00:48.133: E/AndroidRuntime(751): java.lang.RuntimeException: Unable to start activity ComponentInfo{Activity}: java.lang.NullPointerException
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.access$1500(ActivityThread.java:117)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.os.Handler.dispatchMessage(Handler.java:99)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.os.Looper.loop(Looper.java:130)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.main(ActivityThread.java:3683)
03-25 13:00:48.133: E/AndroidRuntime(751):  at java.lang.reflect.Method.invokeNative(Native Method)
03-25 13:00:48.133: E/AndroidRuntime(751):  at java.lang.reflect.Method.invoke(Method.java:507)
03-25 13:00:48.133: E/AndroidRuntime(751):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-25 13:00:48.133: E/AndroidRuntime(751):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-25 13:00:48.133: E/AndroidRuntime(751):  at dalvik.system.NativeStart.main(Native Method)
03-25 13:00:48.133: E/AndroidRuntime(751): Caused by: java.lang.NullPointerException
03-25 13:00:48.133: E/AndroidRuntime(751):  at Activity.onCreate(Activity.java:250)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
03-25 13:00:48.133: E/AndroidRuntime(751):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
03-25 13:00:48.133: E/AndroidRuntime(751):  ... 11 more

Activity.onCreate(Activity.java:250) 指向这一行:

map.setOnMarkerDragListener(markerDragListener);

我所尝试的

奇怪的是,如果我添加这一行

<uses-library android:name="com.google.android.maps" />

AndroidManifest.xml,logcat 将不显示任何内容(无错误无警告),地图仍为空白。但是有人发帖说这条线解决了她/他的空白地图问题:https://stackoverflow.com/questions/15595357/android-supportmapfragment-google-play-services-issue

在我项目的Android Dependencies 文件夹中,我有这些*.jar 文件:

actionbar-sherlock-4.2-library.jar
google-play-services_lib.jar
android-support-v4.jar
actionbarsherlock-plugin-maps-4.2.0.jar
google-play-services.jar

this post 的回答中,我知道 Google 地图可能无法在模拟器上正常运行。我所需要的只是让地图显示在我失败的真正的 Android 2.3 设备上。

此外,我也密切关注这些帖子并尝试了他们的方法(如果适用于我的情况),但仍然对我的问题不满意:

Google Map V2 android map referencing

How to use Google Maps API v2 with API level 10?

Google MapFragment is blank (white) with Could not find class 'maps.j.k'

Using ActionBarSherlock With the New SupportMapFragment

如果您需要更多信息,请在下方留言,我会尽力添加。

【问题讨论】:

    标签: android google-maps google-maps-android-api-2


    【解决方案1】:

    好的,经过数小时的思考和尝试,我想我可以将此问题标记为已修复。

    问题是由 2.3 设备中的错误的日期和时间引起的。

    2.3 设备上的时间和日期由于长时间没电被重置为 2013/01/01(正如您在日志输出中看到的,它显示 01/04 为日期)。这也可以解释为什么使用相同的代码运行时,Google Maps V2 没有显示在 2.3 设备上,但会显示在 4.0+ 设备上(因为我使用的 4.0+ 设备有正确的时间)。

    我认为由于此设备与 Google 地图服务器之间的日期和时间差异巨大,它们之间的通信出现故障(不知道具体原因,但应该是一些时间戳的东西)。

    当我手动将2.3设备的日期和时间设置为当前时间时,问题立即得到解决。

    这个问题太奇怪了,注销只是显示如下:

    找不到从方法 maps.z.ag.a 引用的类“maps.i.k”

    是如此模棱两可,让我很难想到问题是由设备上错误的日期和时间引起的。

    所以下次如果您在使用 Google Maps API 时遇到问题,请按照以下步骤进行检查:

    • 检查您设备的日期和时间设置是否与您的 当前时区(不幸的是,日志输出不会返回太多建设性信息来引导您考虑日期和时间)
    • 检查您是否在 API 控制台中启用了正确的服务 (启用Google Maps API Android V2 而不是Google Maps API V2,登录 如果您做错了什么,将返回Authentication Failed 这一步)
    • 检查您是否使用了正确的密钥库来获取 API 机密( 日志会给你一个提示说Authentication Failed
    • 检查您是否包含了正确的库文件

    感谢任何试图帮助我的人,我希望这个问题和解决方案可以帮助其他人。

    【讨论】:

    • 谢谢先生!我花了很长时间弄清楚我配置错误的地方,结果是“Google Maps API v2”与“Google Maps API Android v2”。当...
    • 很好的答案,这是一个不寻常的场景。我取下了手机的电池。然后日期和时间休息了。之后地图开始崩溃,直到我看到这篇文章。你确实为我节省了几个小时的工作时间。谢谢楼主!
    【解决方案2】:

    这是google Map using Api v2中的常见问题。google play service中的主要原因是如果google play service更新了则只会显示地图视图。如果您在设备中运行应用程序可以解决问题。所以最好在设备上试用它会为你工作的!

    【讨论】:

    • 感谢您的帮助。然而问题是,正如我所提到的,我已经在运行 Android 2.3 的真实设备上进行了尝试,但仍然得到一张空白地图
    • @ss1271,您是否在清单文件中添加了地图接收权限
    • 是的,同样的代码可以在真正的Android 4.0+设备上运行和显示地图没有任何问题。
    • @ss1271 在mapview中没有错误你的错误是空指针异常,你可能会错过drawables中的一些文件(图像),2.3可能有不同的分辨率配置文件,例如:drawables ldpi(可能是mdpi)。 ..我想是的..!!
    • Thx,但只有在模拟器上运行应用程序时才会出现空指针异常。当我在真正的 Android 2.3 设备上运行该应用程序时,它会显示 Could not find class 'maps.i.k', referenced from method maps.z.ag.a(请参阅我的问题以查看整个日志输出)
    【解决方案3】:

    查看这个相关问题:Google Maps on Android blank space

    看起来从 v1 到 v2 的更改使得获取新的 API 密钥变得困难,并且在 v2 中,密钥存储在清单中。让我知道这是否有效。

    【讨论】:

    • 您好,谢谢您的帮助。最奇怪的是地图会显示并在 Android 4.0+ 上完美运行,相同的代码不适用于 Android 2.3,只留下带有放大/缩小按钮的灰色区域。 (请参阅我的问题以检查日志输出),无论如何谢谢帮助。
    【解决方案4】:

    好的。我认为下面的链接会对您有所帮助,因为它也让我也遇到了同样的问题。虽然我不确定你在 API 级别 4.0+ 版本中没有遇到任何问题

    google-maps-v2-shows-blank-screen-on-android-2-2

    问题可能是因为Debug.keystore

    解决方案:确保您使用与您创建用于获取 API 密钥的 SHA-1 代码相同的密钥库来调试您的应用程序。

    假设您正在使用 Ubantu 并以 root 身份打开您的 Eclipse,那么每当您构建您的应用程序时,eclipse 将使用 default.keystore 在位于root/.android/debug.keystore 的设备中运行您的应用程序,因此当您创建 API 密钥时,您拥有确保您使用的是用于构建应用程序的同一密钥库。

    希望对你有所帮助。

    【讨论】:

    • 您好,谢谢您的帮助。相同的代码可以完美运行在 Android 4.0+ 上,我保证我使用的是调试密钥来获取 API 身份验证,所以我认为这应该不是 keystore 的问题?
    【解决方案5】:

    将这两个权限添加到 AndroidManifest.xml 文件中:

    <permission
     android:name="YOUR_PACKAGE_NAME.permission.MAPS_RECEIVE"
     android:protectionLevel="signature"/>
    <uses-permission android:name="YOUR_PACKAGE_NAME.permission.MAPS_RECEIVE"
     android:protectionLevel="signature"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2018-04-23
      • 2015-08-14
      • 1970-01-01
      • 1970-01-01
      • 2020-11-23
      • 1970-01-01
      相关资源
      最近更新 更多