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:
- Play Servicios de ubicación getLastLocation devuelve null
- Servicios de Google Play que faltan en el emulador (Android 4.4.2)
- Uso del nuevo ID de Anunciante de Android en un SDK
- Android: comprobación de si la ubicación de los ajustes de Google está habilitada
- Uso de los nuevos servicios de Google Play
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
- ¿Dónde se pueden descargar las pruebas Android de las aplicaciones Android de Google Play?
- ¿Tengo que publicar mi aplicación en la misma cuenta de Google que configuré Google Play Services?
- ¿Por qué Google recomienda copiar bibliotecas en tu árbol?
- Cómo borrar cuentas y credenciales predeterminadas de GoogleApiClient
- Falta de servicios de Google Play desde AVD
- Mensaje "Los servicios de Google Play se están actualizando" en SupportMapFragment cuando están en modo de publicación
- Cómo probar Google App Invites
- android-apt-compilador: No hay herramientas de compilación en el SDK de Android
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.
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.