0

我正在使用适用于 Android 的 Google Maps v2 开展一个项目,并且我正在花一些NoSuchFieldError时间在有根的 HTC Desire HD 上实例化 Google 地图片段。

Afaik,这个问题不应该是由于设备上没有安装 Google Play 服务引起的(尽管它们已经安装并且其他使用 Google Maps v2 的应用程序正在运行)。

在设置的内容视图GooglePlayServicesUtil.isGooglePlayServicesAvailable之前,我尝试检查设备上是否安装了 Google Play Services 库(通过调用)。Activity

此外,该应用程序可在其他 Android 手机上运行,​​并且地图片段已成功充气。

目前我怀疑这个问题是由我在 Eclipse 中设置的 Android 项目引起的,因为在打包或部署期间,Google Play 服务库项目似乎没有与我的项目一起包含。

有没有人解决了这个问题,谷歌地图只在某些设备上工作而在其他设备上抛出NoSuchFieldError异常?如果是这样,我该怎么做才能解决这个问题?

如果您需要更多信息,例如项目设置和/或代码,请发表评论。

谢谢!

这是来自 ACRA 的 JSON 格式的堆栈跟踪报告:

{ CUSTOM_DATA: '', STACK_TRACE: 'java.lang.NoSuchFieldError: com.google.android.gms.R$string.common_google_play_services_unsupported_text\n\tat com.google.android.gms.common.GooglePlayServicesUtil.b(Unknown Source)\n\tat com.google.android.gms.internal.bb.a(Unknown Source)\n\tat com.google.android.gms.internal.bb.onCreateView(Unknown Source)\n\tat com.google.android.gms.maps.SupportMapFragment.onCreateView(Unknown Source)\n\tat android.support.v4.app.Fragment.performCreateView(Fragment.java:1460)\n\tat android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884)\n\tat android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1066)\n\tat android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1168)\n\tat android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:280)\n\tat android.view.LayoutInflater.createViewFromTag(LayoutInflater.java)\n\tat android.view.LayoutInflater.rInflate(LayoutInflater.java)\n\tat android.view.LayoutInflater.inflate(LayoutInflater.java)\n\tat android.view.LayoutInflater.inflate(LayoutInflater.java)\n\tat android.view.LayoutInflater.inflate(LayoutInflater.java)\n\tat com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java)\n\tat android.app.Activity.setContentView(Activity.java)\n\tat ro.myapp.app.activities.MapActivity.onCreate(MapActivity.java:62)\n\tat android.app.Activity.performCreate(Activity.java)\n\tat android.app.Instrumentation.callActivityOnCreate(Instrumentation.java)\n\tat android.app.ActivityThread.performLaunchActivity(ActivityThread.java)\n\tat android.app.ActivityThread.handleLaunchActivity(ActivityThread.java)\n\tat android.app.ActivityThread.access$600(ActivityThread.java)\n\tat android.app.ActivityThread$H.handleMessage(ActivityThread.java)\n\tat android.os.Handler.dispatchMessage(Handler.java)\n\tat android.os.Looper.loop(Looper.java)\n\tat android.app.ActivityThread.main(ActivityThread.java)\n\tat java.lang.reflect.Method.invokeNative(Native Method)\n\tat java.lang.reflect.Method.invoke(Method.java)\n\tat com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)\n\tat com.android.internal.os.ZygoteInit.main(ZygoteInit.java)\n\tat dalvik.system.NativeStart.main(Native Method)\n', PHONE_MODEL: 'HTC Desire HD', ANDROID_VERSION: '4.0.4' }

这是我onCreate抛出异常的方法:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    checkForPlayServices();

    setContentView(R.layout.activity_map);
    mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
    map = mapFragment.getMap();
    map.setMyLocationEnabled(true);
    map.setInfoWindowAdapter(this);
    map.setOnInfoWindowClickListener(this);
}

activity_map.xml布局内容:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapActivity" >

    <ro.myapp.app.views.actionbar.ActionbarMap
        android:id="@+id/actionBar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/myapp_actionbar_height" />

    <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_below="@id/actionBar"
        class="com.google.android.gms.maps.SupportMapFragment" />

</RelativeLayout> 
4

2 回答 2

2
java.lang.NoSuchFieldError: com.google.android.gms.R$string.common_google_play_services_unsupported_text

确切地说出了什么问题。

在 values/strings.xml 中没有

<string name="common_google_play_services_unsupported_text">...</string>

定义。

我在我的 google-play-services_lib/res 中看到了这个值,所以您可能想检查您是否将此库项目正确添加到您的工作区。好像您在更新库时忘记更新 strings.xml 了。

于 2013-07-02T08:12:02.703 回答
0

好的,所以我改变了我的答案,我发现有一种方法可以找出是否有任何东西覆盖了你的库......你正在某处使用位置对象,所以添加这段代码并在运行其中一个设备时对其进行调试。 .... location 对象应该在您的位置侦听器中。

 location.getClass().getProtectionDomain().getCodeSource().getLocation() ;
于 2013-07-01T20:06:09.123 回答