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

时间:2013-03-25 13:08:34

标签: 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设备上试用它时,地图区域将像下面显示的屏幕截图一样空白:

enter image description here

该应用使用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" />

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

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

5 个答案:

答案 0 :(得分:5)

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

问题是由错误的日期&amp; 2.3设备中的时间

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

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

当我手动将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密码(The 日志会给你一个提示Authentication Failed
  • 的提示
  • 检查您是否包含了正确的库文件

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

答案 1 :(得分:1)

这是google Map using Api v2中常见的问题。google play service中的主要原因是google play service更新后只会显示mapview。如果运行,问题就可以解决在设备中的应用程序。更好的尝试在设备,它将为你工​​作!!

答案 2 :(得分:1)

查看以下相关问题:Google Maps on Android blank space

从v1到v2的变化看起来很难获得新的API密钥,而在v2中,密钥存储在清单中。如果有效,请告诉我。

答案 3 :(得分:1)

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

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

问题可能是因为Debug.keystore

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

假设您正在使用Ubantu并以root身份打开Eclipse,那么每当您构建应用程序时,eclipse将使用default.keystore在root/.android/debug.keystore中的设备中运行您的应用程序,以便在创建API密钥时你必须确保你使用的是与你构建应用程序相同的Keystore。

希望它会对你有所帮助。

答案 4 :(得分:1)

将这两个权限添加到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"/>