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() ;