Seit ich (heute Morgen) auf Android SDK Tools 25.1.6 und Android Support Repository 32.0.0 aktualisiert habe, ist der folgende Fehler aufgetreten. Ich habe nichts an meinem Code geändert und er funktioniert immer noch auf meinem Kollegencomputer (Android SDK Tools) 25.1.1 + Android Support Repository 30.0.0).
java.lang.IncompatibleClassChangeError: The method
'java.io.File android.support.v4.content.ContextCompat.getNoBackupFilesDir(android.content.Context)'
was expected to be of type virtual but instead was found to be of type direct
(declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar)
at com.google.android.gms.iid.zzd.zzeb(Unknown Source)
at com.google.android.gms.iid.zzd.<init>(Unknown Source)
at com.google.android.gms.iid.zzd.<init>(Unknown Source)
at com.google.android.gms.iid.InstanceID.zza(Unknown Source)
at com.google.android.gms.iid.InstanceID.getInstance(Unknown Source)
at com.xxxxxxx.utils.RegistrationIntentService.onHandleIntent(RegistrationIntentService.java:55)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.os.HandlerThread.run(HandlerThread.java:61)
Hier ist der Code, der abstürzt:
InstanceID instanceID = InstanceID.getInstance(this); // <-- crash here
String instanceIDToken = instanceID.getToken(getString(R.string.google_app_id),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Es ist, wenn ich versuche, ein Token von Google Cloud Messaging zu erhalten.
Ich importiere GCM in Gradle mit geteilten Spieldiensten:
compile 'com.google.android.gms:play-services-analytics:9.0.0'
compile 'com.google.android.gms:play-services-maps:9.0.0'
compile 'com.google.android.gms:play-services-location:9.0.0'
compile 'com.google.android.gms:play-services-gcm:9.0.0'
compile 'com.google.android.gms:play-services-base:9.0.0'
Das Deaktivieren von GCM durch EDIT hat das Problem behoben. Ich gehe also davon aus, dass ich auf Firebase Cloud Message migrieren sollte
EDIT2 Mein Gerät erhält Google Play Services 9.0 (gestern war 8.4.x). Jetzt stürzt es nicht mehr ab, sondern beschwert sich über den Moduldeskriptor
Failed to load module descriptor class: Didn't find class "com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor"
Firebase API initialization failure.
Hat jemand einen ähnlichen Fehler und wie kann er behoben werden?
FIXED
besonderer Dank an @stegranet.
./gradlew -q app:dependencies --configuration compile
hilft Ihnen zu identifizieren, welche Abhängigkeiten SDK 24.x enthalten
Hauptproblem ist, dass einige Bibliotheken die neueste Supportbibliothek mit +
sign anstelle einer Version importieren . Dies verursacht das Problem, indem die neueste verfügbare Version hinzugefügt wird.
Vermeiden Sie also +
Anmeldeabhängigkeiten;)
Antworten:
Ich habe den Gradle-Abhängigkeitsbaum verwendet, um diesen Fehler für mich zu beheben.
Führen Sie einfach aus
gradle -q app:dependencies --configuration compile
und überprüfen Sie die Ausgabe auf Einträge wie diese:+--- com.mcxiaoke.viewpagerindicator:library:2.4.1 | \--- com.android.support:support-v4:+ -> 24.0.0-beta1 (*)
Wie Diego Giorgini sagte, ist diese Version zu hoch (> = 24). Aktualisieren Sie also die Abhängigkeiten in
build.gradle
likecompile('com.mcxiaoke.viewpagerindicator:library:2.4.1') { exclude module: 'support-v4'; } compile 'com.android.support:support-v4:23.4.0'
quelle
+
Zeichens importieren (wie in Ihrem Beispiel). Dazu gehört auch die neueste Version, die nicht in den Koffer passt. Vielen Dank!Update 27. Mai:
Wir haben gerade ein Update (
version 9.0.1
) veröffentlicht, um die Inkompatibilität zu beheben, die ich in meiner ersten Bearbeitung erwähnt habe.Bitte aktualisieren Sie Ihre Abhängigkeiten und teilen Sie uns mit, ob dies immer noch ein Problem ist.
Vielen Dank!
ursprüngliche Antwort 20. Mai:
Das Problem, das auftritt, ist auf eine Inkompatibilität zwischen
play-services / firebase sdk v9.0.0
und zurückzuführencom.android.support:appcompat-v7 >= 24
(die mit android-N sdk veröffentlichte Version).
Sie sollten in der Lage sein, das Problem zu beheben, indem Sie auf eine frühere Version der Support-Bibliothek abzielen. Mögen:
compile 'com.android.support:appcompat-v7:23.4.0'
quelle
meins arbeitete mit folgenden:
App Level Gradle
dependencies { compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:design:23.4.0' compile 'com.google.android.gms:play-services:9.0.0' }
Wurzelstufe Gradle
dependencies { classpath 'com.google.gms:google-services:3.0.0' }
quelle
Ich habe die Play-Services-Abhängigkeiten in aktualisiert
build.gradle
dependencies { compile 'com.google.android.gms:play-services:9.0.0' }
Um den Versionskonflikt entweder durch Aktualisieren der Version des Google Services-Plugins zu beheben, musste ich die Google Services im
build.gradle
Stammordner des Projekts aktualisierendependencies { classpath 'com.google.gms:google-services:3.0.0' }
Das neueste Update der Google-Dienste erhalten Sie hier .
Obwohl es die Ausnahme nicht vermeidet, aber die Anwendung auf meiner Seite nicht mehr zum Absturz bringt.
Aktualisieren
Ich könnte den Absturz vermeiden, indem ich das Android Studio von Beta Channel aktualisiere. Aktualisieren Sie dann Ihr
platform/build-tools
Inside SDK.quelle
Das Update auf die neueste Version von Google Play Services hat das Problem für mich behoben.
Plugin anwenden: 'com.google.gms.google-services' unten ...
dependencies { compile 'com.google.android.gms:play-services:9.0.0' }
https://developers.google.com/android/guides/setup#add_google_play_services_to_your_project
quelle
9.0.0
habe aber immer noch das Problem. Ich benutze derzeit Splitedgms
. :compile 'com.google.android.gms:play-services-analytics:9.0.0' compile 'com.google.android.gms:play-services-maps:9.0.0' compile 'com.google.android.gms:play-services-location:9.0.0' compile 'com.google.android.gms:play-services-gcm:9.0.0' compile 'com.google.android.gms:play-services-base:9.0.0'
play-services:9.0.0
, aber immer noch das gleiche Problem.Ist mir passiert, weil Facebook es sdk aktualisiert hat und ich hatte
compile 'com.facebook.android:facebook-android-sdk:4.+'
Ersetzen zu
compile 'com.facebook.android:facebook-android-sdk:4.15.0'
löste mein Problem.
Ref: https://developers.facebook.com/docs/android/change-log-4.x
quelle
Durch Einbeziehen aller Pakete der Spieldienste
dependencies { compile 'com.google.android.gms:play-services:9.0.0' }
Sie unterdrücken den Fehler, aber das Endergebnis ist, dass der GCM-Token-Abruf nicht funktioniert und wir keine Instanz des GCM erhalten können. Das ist also keine Lösung in meinen Büchern. Wenn jemand eine Idee hat, was los ist, klären Sie uns bitte auf.
BEARBEITEN:
Ich habe GCM durch Firebase ersetzt, Android Studio von 2.1 auf 2.2 aktualisiert, um das Problem der sofortigen Ausführung mit Firebase-Analysen zu beheben, Build-Tools auf 24-rc4 und Plattform-Tools auf 24-rc3 aktualisiert und die Version meiner Support-Bibliotheken auf 23.4.0 beibehalten. Alles scheint jetzt gut zu funktionieren.
quelle
Ich hatte das gleiche Problem und das Zurücksetzen von Android Support Repository 32.0.0 auf Android Support Repository 31.0.0 löste es.
quelle
Für Android Push-Benachrichtigung mit GCM 2016:
1) Überprüfen Sie in Android SDK-> SDK Tools die Google Play-Dienste
2) In Gradle fügen Sie in Abhängigkeiten nur eine Zeile hinzu:
compile 'com.google.android.gms:play-services-gcm:9.4.0'
(Es gibt keinen bestimmten Klassenpfad und es funktioniert für mich)
3) Sie müssen 3 Klassen erstellen (GCMPushReceiverService, GCMRegistrationIntentService, GCMTokenRefreshListenerService).
4.1) Code für GCMTokenRefreshListenerService:
package com.myapp.android; /** * Created by skygirl on 02/08/2016. */ import android.content.Intent; import com.google.android.gms.iid.InstanceIDListenerService; public class GCMTokenRefreshListenerService extends InstanceIDListenerService { //If the token is changed registering the device again @Override public void onTokenRefresh() { Intent intent = new Intent(this, GCMRegistrationIntentService.class); startService(intent); } }
4.2) Code für GCMRegistrationIntentService (ändern Sie die autorisierte Entität mit Ihrer Projektnummer):
package com.myapp.android; /** * Created by Skygirl on 02/08/2016. */ import android.app.IntentService; import android.content.Intent; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.google.android.gms.gcm.GoogleCloudMessaging; import com.google.android.gms.iid.InstanceID; public class GCMRegistrationIntentService extends IntentService { //Constants for success and errors public static final String REGISTRATION_SUCCESS = "RegistrationSuccess"; public static final String REGISTRATION_ERROR = "RegistrationError"; //Class constructor public GCMRegistrationIntentService() { super(""); } @Override protected void onHandleIntent(Intent intent) { //Registering gcm to the device registerGCM(); } private void registerGCM() { //Registration complete intent initially null Intent registrationComplete = null; //Register token is also null //we will get the token on successfull registration String token = null; try { //Creating an instanceid InstanceID instanceID = InstanceID.getInstance(this); String authorizedEntity = "XXXXXXXXXX"; // your project number //Getting the token from the instance id token = instanceID.getToken(authorizedEntity, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); //Displaying the token in the log so that we can copy it to send push notification //You can also extend the app by storing the token in to your server Log.w("GCMRegIntentService", "token:" + token); //on registration complete creating intent with success registrationComplete = new Intent(REGISTRATION_SUCCESS); //Putting the token to the intent registrationComplete.putExtra("token", token); } catch (Exception e) { //If any error occurred Log.w("GCMRegIntentService", "Registration error"); registrationComplete = new Intent(REGISTRATION_ERROR); } //Sending the broadcast that registration is completed LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete); } }
4.3) Code für GCMPushReceiverService:
package com.myapp.android; /** * Created by Skygirl on 02/08/2016. */ import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.RingtoneManager; import android.os.Bundle; import android.support.v4.app.NotificationCompat; import com.google.android.gms.gcm.GcmListenerService; //Class is extending GcmListenerService public class GCMPushReceiverService extends GcmListenerService { //This method will be called on every new message received @Override public void onMessageReceived(String from, Bundle data) { //Getting the message from the bundle String message = data.getString("message"); //Displaying a notiffication with the message sendNotification(message); } //This method is generating a notification and displaying the notification private void sendNotification(String message) { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); int requestCode = 0; PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_ONE_SHOT); NotificationCompat.Builder noBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.your_logo) .setContentTitle("Your Amazing Title") .setContentText(message) .setPriority(Notification.PRIORITY_MAX) .setContentIntent(pendingIntent); noBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)); NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0, noBuilder.build()); //0 = ID of notification } }
5) Vergessen Sie nicht, den Paketnamen zu ändern
6) Fügen Sie in Ihre mainActivity diesen Code ein:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Setup view setContentView(R.layout.main); mRegistrationBroadcastReceiver = new BroadcastReceiver() { //When the broadcast received //We are sending the broadcast from GCMRegistrationIntentService public void onReceive(Context context, Intent intent) { //If the broadcast has received with success //that means device is registered successfully if(intent.getAction().equals(GCMRegistrationIntentService.REGISTRATION_SUCCESS)){ //Getting the registration token from the intent String token = intent.getStringExtra("token"); //Displaying the token as toast Toast.makeText(getApplicationContext(), "Registration token:" + token, Toast.LENGTH_LONG).show(); //if the intent is not with success then displaying error messages } else if(intent.getAction().equals(GCMRegistrationIntentService.REGISTRATION_ERROR)){ Toast.makeText(getApplicationContext(), "GCM registration error!", Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(), "Error occurred", Toast.LENGTH_LONG).show(); } } }; //Checking play service is available or not int resultCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext()); //if play service is not available if(ConnectionResult.SUCCESS != resultCode) { //If play service is supported but not installed if(GooglePlayServicesUtil.isUserRecoverableError(resultCode)) { //Displaying message that play service is not installed Toast.makeText(getApplicationContext(), "Google Play Service is not install/enabled in this device!", Toast.LENGTH_LONG).show(); GooglePlayServicesUtil.showErrorNotification(resultCode, getApplicationContext()); //If play service is not supported //Displaying an error message } else { Toast.makeText(getApplicationContext(), "This device does not support for Google Play Service!", Toast.LENGTH_LONG).show(); } //If play service is available } else { //Starting intent to register device Intent itent = new Intent(this, GCMRegistrationIntentService.class); startService(itent); } } //Unregistering receiver on activity paused @Override public void onPause() { super.onPause(); Log.w("MainActivity", "onPause"); LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver); } @Override public void onResume() { super.onResume(); Log.w("MainActivity", "onResume"); LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, new IntentFilter(GCMRegistrationIntentService.REGISTRATION_SUCCESS)); LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver, new IntentFilter(GCMRegistrationIntentService.REGISTRATION_ERROR)); }
7) Fügen Sie in Ihrer AndroidManifest.xml folgende Zeilen hinzu:
<uses-permission android:name="android.permission.INTERNET" />
8) Kopieren Sie in Ihrem Konsolen-Logcat Ihr Token und fügen Sie es auf dieser Site ein. Fügen Sie Ihre Projektnummer, Ihr Token und eine Nachricht hinzu. Es funktioniert gut für mich :)
quelle
Nach einem ganzen Tag kann ich zu 100% bestätigen, dass die Optimizely-Bibliothek ebenfalls in irgendeiner Weise zusammenstößt und diesen Fehler verursacht. Um genau zu sein, verwende ich Optimizely via Fabric. Es ist unmöglich, Firebase zu veranlassen, zu initialisieren, während Optimizely auf diese Weise verwendet wird (möglicherweise auf alle Arten?).
Ich habe auf ihrem Github darüber gepostet und werde sie direkt kontaktieren ...
https://github.com/optimizely/Optimizely-Android-SDK/issues/11
quelle
Ich hatte das gleiche Problem. Ich habe die SDK-Tools auf 25.1.7 rc1 aktualisiert, dann war das Problem behoben.
quelle
Die SDK-Tools wurden auf 25.1.7 aktualisiert und dieses Problem behoben.
quelle
Nun, ich bin nur Anfänger in der Verwendung von Android. Ich wollte das Erstellen von Benutzern
Firebase
anhand der Anweisungen auf der Firebase-Website testen .Ich habe diese Zeilen an den angegebenen Stellen hinzugefügt.
Die Methode createUserWithEmailAndPassword zeigte jedoch weiterhin Fehler beim Erstellen von Benutzern. Deshalb habe ich diese Frage besucht, um mein Problem herauszufinden. Ich habe alles gelesen und jeden Rat angewendet. Aber die IT zeigte immer wieder Fehler. Beim Upgrade
Android Studio from 2.1.1 to 2.1.2
konnte ich jedoch erfolgreich Benutzer erstellen.Aber als ich nachgesehen habe
logcat
, wurde zuerst"Firebase API initialization failure"
"FirebaseApp-Initialisierung erfolgreich" angezeigt und dann angezeigt.quelle
Ich bin mit diesem Problem konfrontiert und ändere meine App-Gradle-Version von 1.5.0 auf 2.0.0.
Klassenpfad ändern
com.android.tools.build:gradle:1.5.0
zu
classpath 'com.android.tools.build:gradle:2.0.0
quelle
Lösung 1:
dependencies { compile `com.android.support:appcompat-v7:23.4.0` compile `com.android.support:support-v4:23.4.0` compile `com.android.support:design:23.4.0` compile `com.google.android.gms:play-services:9.0.0` }
Lösung 2: Inkompatibel im Ordner .idie / library /. Erkennen. Manchmal deklarieren Sie Play-Services-Anzeigen: 8.4.0 gleichzeitig mit Play-Services-gcm: 9.0.0. Sie müssen inkompatible Bibliotheken von build.grade überschreiben, die Sie erkannt haben
quelle