Android Google Maps API v2 - NoSuchFieldError

Я работаю над проектом с использованием Google Maps v2 для Android и получаю NoSuchFieldError создавая экземпляр фрагмента карты Google на рутированном HTC Desire HD.

Afaik, проблема не должна быть вызвана тем, что Сервисы Google Play не установлены на устройстве (хотя они и работают, и другие приложения, использующие Google Maps v2 работают).

Я попытался проверить, установлена ​​ли на устройстве библиотека Google Play Services (позвонив по GooglePlayServicesUtil.isGooglePlayServicesAvailable) до установки ActivityКонтент просмотра.

Кроме того, приложение работает на других телефонах Android, и фрагмент карты успешно раздувается.

В настоящий момент я подозреваю, что эта проблема вызвана настройкой моего проекта Android в Eclipse, так как проект библиотеки Google Play Services, по-видимому, не включен вместе с моим проектом во время упаковки или развертывания.

Кто-нибудь имел и решил эту проблему с Google Maps работает только на некоторых устройствах и выбрасывает 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> 

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 при обновлении библиотеки.

Итак, я изменил свой ответ. Я обнаружил, что есть способ узнать, есть ли что-то, что переопределяет ваши библиотеки.... Вы где-то используете объекты Location, так что добавьте этот бит кода и отлаживайте его при запуске одного из этих устройств..... Объект местоположения должен быть в вашем слушателе местоположения.

 location.getClass().getProtectionDomain().getCodeSource().getLocation() ;
Другие вопросы по тегам