34

Vielleicht etwas hier fehlt mir, aber ich bin nicht in der Lage die neuen Karten nur zu verwenden, die Abhängigkeit in Play Services 6.5NoSuchFieldError: Keine statische Feld MapAttrs vom Typ bei Verwendung von MapFragment mit Play Services 6.5

Ich erhalte die folgende Ausnahme :

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) 

Manifest:

<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 Datei:

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

Layout:

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

Ist das gebrochene oder mache ich etwas falsch?

Der vollständige Bündel schiebt mich über die dex Grenze, und ich würde es vorziehen, nicht verwenden multidex

+1

Ich versuche immer noch zu wissen, warum dies geschieht, aber ich schlage vor, Sie schließen die ganze gms statt nur 'Play Bundle -services-maps' –

+0

@PedroOliveira Die Abhängigkeitsverknüpfungen im Basis-Bundle, also keine Notwendigkeit – pablisco

+4

Problem ist 'com.google.android.gms.R $ styleable.MapAttrs', aber generierte R-Datei für Karten hat ein anderes Paket' com.google. android.gms.maps.R $ styleable.MapAttrs scheint wie Fehler mit dieser Version von "granualr hängt" und wie jetzt ist "Selectively kompilieren APIs" ist nicht verwendbar ... – Selvin

Antwort

17

Aktualisieren Sie Ihre Google Repository auf Version 15 über den SDK-Manager sollte die Probleme lösen und die Notwendigkeit für die Problemumgehungen beseitigen. Eine Projektbereinigung ist erforderlich.

Android SDK

ist dies auch in issue 7432 erwähnt.

+0

Bestätigt, dass dies für uns funktioniert – Jedidja

+0

Mein Problem wurde "verursacht durch: java.lang.NoSuchFieldError: com.google.android.gms.R $ styleable.AdsAttrs", und dies wurde gelöst. Danke – magirtopcu

+0

Ein 'gradle clean', dann' gradle build' wurde für mich benötigt, nachdem ich Google Repository aktualisiert habe. Ich denke, wenn Sie neue Abhängigkeiten oder Updates importieren, tendiert Android Studio dazu, bei der Suche nach den Ressourcen etwas zurückzustehen. –

4

ich eine „Hacky“ fix gefunden, um es mit Ihrer App funktioniert, bis Google dies zu beheben entscheidet:

Fügen Sie diese auf Ihrem app gradle Skript:

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') 
      } 
     } 
    } 
} 
+0

Super hacken, aber es funktioniert gut für Karten! :) –

+12

Beachten Sie, dass dies eine schreckliche Lösung ist, die nicht skaliert wird, wenn Sie mehr als eine Play-Services-Unterbibliothek verwenden. Wir werden das Problem richtig beheben. –

+1

@ XavierDucrohet: Ja! sie zu verschmelzen wäre zu viel. Ich habe mir vorgestellt, dass du daran arbeiten wirst ... Aber es ist unglaublich zu sehen, dass du auf der Jagd bist. Ich war zu aufgeregt und wollte deine neuen Bibliotheken ausprobieren, hehe. War nicht für eine endgültige Lösung gedacht :) – pablisco

5

Zwischenlösung

ersetzen die xML-Fragment der Karte mit einem FrameLayout Behälter

<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"/>--> 

Erstellen Sie das Fragment in Code und ersetzen Sie den Behälter

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

Bitte beachten Sie, dass die oben in ‚onCreate‘ ohne weitere Fragmente in einer Aktivität durchgeführt wurde, so stellen Sie sicher, dass Sie die Transaktion anzupassen Ihr Lebenszyklus und Ihre Logik.

+1

Oh Mann, das OnMapReadyCallback, kein Wunder, dass ich immer Null für die Karte bekam. – Bri6ko

0

Endlich habe ich die Ursache herausgefunden. Wenn Sie die aar-Dateien für Ihre eigenen Eclipse-Vorteile entführen wollen (ich werde hier nicht lehren, wie das Android-Studio nicht funktioniert), müssen Sie die Datei maps_attrs.xml auf die -Datei verschieben. Services-Basis res/Werte Ordner. Dadurch werden die Attribute und die generierte R.class-Datei auf dem Klassenpfad ausgerichtet, den die Maps-Bibliothek erwartet.

Sample use of play-services-base

1

Ich glaube, Sie haben das Layout sowohl in der Bibliothek und das Modul mit dem gleichen Namen oder mehr XML-Layout mit doppelter Ressource-ID aufpumpen.

Suche map_attrs in Play-Dienste-lib und mit diesem Code ersetzen:

<?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> 
+0

Danke, Ihre Antwort löste mein Problem auch :) Ich denke, Sie haben Layout in der Bibliothek und Modul mit dem gleichen Namen oder das Aufblasen mehrerer XML-Layout mit doppelten Ressourcen-ID. –

Verwandte Themen