NoSuchFieldError: No hay campo estático MapAttrs de tipo cuando se utiliza MapFragment con Play Services 6.5

Tal vez estoy perdiendo algo aquí, pero no soy capaz de usar la nueva dependencia de Google Maps en Play Services 6.5

Tengo la siguiente excepción:

java.lang.NoSuchFieldError: No static field MapAttrs of type [I in class Lcom/google/android/gms/R$styleable; or its superclasses (declaration of 'com.google.android.gms.R$styleable' appears in /data/app/com.kaching.merchant.dev1-1/base.apk) at com.google.android.gms.maps.GoogleMapOptions .createFromAttributes(Unknown Source) at com.google.android.gms.maps.SupportMapFragment .onInflate(Unknown Source) 

Manifiesto:

 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> <meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="my-awesome-key"/> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/> 

Gradle archivo:

 compile 'com.google.android.gms:play-services-maps:6.5.+' compile 'com.android.support:support-v4:21.0.2' 

Diseño:

 <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.MapFragment" android:layout_width="match_parent" android:layout_height="match_parent"/> 

¿Está esto roto o estoy haciendo algo mal?

El paquete completo me empuja sobre el límite del dex y preferiría no utilizar el multidex

Actualizar su repositorio de Google a la versión 15 través del Administrador de SDK debe resolver los problemas y eliminar las necesidades de las soluciones. Se requiere un proyecto limpio.

SDK de Android

Esto también se menciona en el número 7432 .

Solución interina

Reemplace el fragmento de mapa xml con un contenedor FrameLayout

 <FrameLayout android:id="@+id/map_container" android:layout_weight="2" android:layout_width="match_parent" android:layout_height="0dp" /> <!--<fragment android:id="@+id/map"--> <!--android:layout_weight="2"--> <!--android:layout_width="match_parent"--> <!--android:layout_height="0dp"--> <!--android:name="com.google.android.gms.maps.SupportMapFragment"/>--> 

Cree el fragmento en código y reemplace el contenedor

 SupportMapFragment supportMapFragment = SupportMapFragment.newInstance(); getSupportFragmentManager().beginTransaction().replace(R.id.map_container,supportMapFragment).commit(); //this you should do anyway supportMapFragment.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { //setup map - optional UiSettings settings = googleMap.getUiSettings(); settings.setCompassEnabled(false); settings.setZoomControlsEnabled(false); settings.setAllGesturesEnabled(true); settings.setMyLocationButtonEnabled(true); } }); 

Tenga en cuenta que lo anterior se realizó en 'onCreate' en una actividad sin ningún otro fragmento, así que asegúrese de adaptar la transacción a su ciclo de vida y lógica.

He encontrado una corrección "hacky" para que funcione con tu aplicación hasta que Google decida arreglar esto:

Añada esto a su app gradle script:

 afterEvaluate { def pattern = ~/process(.*)Resources/ tasks.matching { pattern.matcher(it.name).find() }.each { def matcher = pattern.matcher(it.name) matcher.find() def buildType = matcher.group(1) buildType = buildType.substring(0, 1).toLowerCase() + buildType.substring(1) def rDirectory = "$project.buildDir/generated/source/r/$buildType" it << { def badFile = file("$rDirectory/com/google/android/gms/R.java") def goodFile = file("$rDirectory/com/google/android/gms/maps/R.java") if (badFile.exists() && goodFile.exists()) { badFile.text = goodFile.text.replaceAll('com.google.android.gms.maps', 'com.google.android.gms') } } } } 

Creo que tiene el diseño en la biblioteca y el módulo con el mismo nombre o inflar el diseño xml múltiple con id de recurso duplicado.

Encontrar map_attrs en play-services-lib y reemplazar con este código:

 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MapAttrs"> <attr name="mapType" format="enum"> <enum name="none" value="0"/> <enum name="normal" value="1"/> <enum name="satellite" value="2"/> <enum name="terrain" value="3"/> <enum name="hybrid" value="4"/> </attr> <attr name="cameraBearing" format="float"/> <attr name="cameraTargetLat" format="float"/> <attr name="cameraTargetLng" format="float"/> <attr name="cameraTilt" format="float"/> <attr name="cameraZoom" format="float"/> <attr name="liteMode" format="boolean"/> <attr name="uiCompass" format="boolean"/> <attr name="uiRotateGestures" format="boolean"/> <attr name="uiScrollGestures" format="boolean"/> <attr name="uiTiltGestures" format="boolean"/> <attr name="uiZoomControls" format="boolean"/> <attr name="uiZoomGestures" format="boolean"/> <attr name="useViewLifecycle" format="boolean"/> <attr name="zOrderOnTop" format="boolean"/> <attr name="uiMapToolbar" format="boolean"/> <attr name="ambientEnabled" format="boolean"/> </declare-styleable> </resources> 

Finalmente descubrí la causa. Si tienes el hábito de secuestrar los archivos aar para tu propio beneficio de Eclipse (no voy a enseñar aquí porque no es la forma de Android Studio), debes mover el archivo maps_attrs.xml en la base de juegos de servicios Res / valores carpeta. Esto alineará los atributos y el archivo R.class generado en la ruta de clase que espera la biblioteca de mapas.

Ejemplo de uso de play-services-base

  • MapFragment o MapView getMap () devuelve null en Lollipop
  • Problemas para implementar el nuevo cliente de GCM para Android
  • Fuga de Google Play Services
  • Google Play Services versión 5.2.08 demasiado reciente para mi dispositivo
  • Demasiado nueva versión para Android google play
  • Proyecto de API carece de ID de proyecto en Google Developers Console
  • ¿Dónde se pueden descargar las pruebas Android de las aplicaciones Android de Google Play?
  • Android: ¿Es necesario incluir los servicios de Google Play para usar GCM?
  • API de Google Play Music para Android
  • API de reconocimiento de actividad no confiable?
  • Google Awareness API v9.6 está ausente
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.