使用Google API的真实Android 2.3设备上的空白GoogleMap(Lv.17)

dum*_*ers 6 android google-maps google-maps-android-api-2

问题描述,请先阅读此内容

我正在尝试使用我的简单应用程序,该应用程序将显示在从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,min 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" />
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

在真正的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;
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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

map.setOnMarkerDragListener(markerDragListener);

我曾经尝试过什么

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

<uses-library android:name="com.google.android.maps" />
Run Code Online (Sandbox Code Playgroud)

to 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
Run Code Online (Sandbox Code Playgroud)

这篇文章的回答中,我知道谷歌地图可能无法在模拟器上运行良好.我只需要将地图显示在我失败的真正的Android 2.3设备上.

另外,我也密切关注这些帖子,并尝试了他们的方法(如果适用于我的情况),但仍然没有对我的问题感到高​​兴:

Google Map V2 android地图引用

如何使用API​​级别为10的Google Maps API v2?

Google MapFragment为空白(白色),找不到类'maps.jk'

使用ActionBarSherlock和新的SupportMapFragment

如果您需要更多信息,请在下面留言,我会尝试添加它们.

dum*_*ers 5

好吧,经过几个小时的思考和尝试,我想我可以将这个问题标记为已修复.

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

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

我认为由于这个设备和谷歌地图服务器之间的日期和时间的巨大差异,它们之间的通信出现故障(不知道确切原因,但它应该是一些时间戳的东西).

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

这个问题很奇怪,注销只显示如下:

找不到类'maps.i.k',从方法maps.z.ag.a中引用

是如此模糊,使我很难想到问题是由设备上的错误日期和时间引起的.

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

  • 检查您的设备的日期和时间设置是否与您当前的时区相对应(不幸的是,日志输出不会返回很多建设性信息,以引导您考虑日期和时间)
  • 检查您是否在API控制台中启用了正确的服务(如果您对此步骤执行了错误,则Google Maps API Android V2不会启用Google Maps API V2日志Authentication Failed)
  • 检查您是否使用了正确的密钥库来获取API密码(日志会给您一个提示 Authentication Failed
  • 检查是否包含正确的库文件

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