Odkąd zaktualizowałem do Android SDK Tools 25.1.6 i Android Support Repository 32.0.0 (dziś rano), otrzymałem następujący błąd, nie zmieniłem nic w moim kodzie i nadal działa on na moim komputerze kolegi (Android SDK Tools 25.1.1 + repozytorium obsługi Androida 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)
Oto fragment kodu, który się zawiesił:
InstanceID instanceID = InstanceID.getInstance(this); // <-- crash here
String instanceIDToken = instanceID.getToken(getString(R.string.google_app_id),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
To wtedy, gdy próbuję uzyskać token z Google Cloud Messaging.
Importuję GCM w Gradle z podzielonymi usługami odtwarzania:
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'
EDYCJA wyłączająca GCM rozwiązała problem, więc domyślam się, że powinienem przejść do Firebase Cloud Message
EDIT2 Moje urządzenie otrzymuje Usługi Google Play 9.0 (wczoraj było 8.4.x). Teraz już się nie zawiesza, ale narzeka na deskryptor modułu
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.
Czy ktoś ma podobny błąd i jak to naprawić?
NAPRAWIONE
specjalne podziękowania dla @stegranet.
./gradlew -q app:dependencies --configuration compile
pomaga zidentyfikować zależności, które obejmują SDK 24.x.
Głównym problemem jest to, że niektóre biblioteki importują najnowszą bibliotekę wsparcia, używając +
znaku zamiast wersji. To powoduje problem, włączając najnowszą dostępną wersję.
Więc unikaj +
zależności logowania;)
Odpowiedzi:
Użyłem drzewa zależności Gradle, aby rozwiązać ten błąd za mnie.
Po prostu uruchom
gradle -q app:dependencies --configuration compile
i sprawdź dane wyjściowe pod kątem takich wpisów:+--- com.mcxiaoke.viewpagerindicator:library:2.4.1 | \--- com.android.support:support-v4:+ -> 24.0.0-beta1 (*)
Jak powiedział Diego Giorgini , ta wersja jest za wysoka (> = 24). Zaktualizuj zależności w
build.gradle
podobny sposóbcompile('com.mcxiaoke.viewpagerindicator:library:2.4.1') { exclude module: 'support-v4'; } compile 'com.android.support:support-v4:23.4.0'
źródło
+
znaku (jak w twoim przykładzie). Więc gradle zawiera najnowszą wersję, która nie pasuje do obudowy. Dzięki!aktualizacja 27 maja:
właśnie wydaliśmy aktualizację (
version 9.0.1
), aby naprawić niezgodność, o której wspomniałem w mojej pierwszej edycji.Zaktualizuj swoje zależności i daj nam znać, jeśli nadal występuje problem.
Dzięki!
pierwotna odpowiedź 20 maja:
Problem, który napotykasz, jest spowodowany niekompatybilnością między
play-services / firebase sdk v9.0.0
icom.android.support:appcompat-v7 >= 24
(wersją wydaną z Android-N SDK)
Powinieneś być w stanie to naprawić, kierując się na wcześniejszą wersję biblioteki pomocy technicznej. Lubić:
compile 'com.android.support:appcompat-v7:23.4.0'
źródło
mój współpracował z następującymi:
ocena na poziomie aplikacji
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' }
gradle poziomu głównego
dependencies { classpath 'com.google.gms:google-services:3.0.0' }
źródło
Zaktualizowałem zależności usług odtwarzania w
build.gradle
dependencies { compile 'com.google.android.gms:play-services:9.0.0' }
Aby naprawić konflikt wersji, albo aktualizując wersję wtyczki Google-Services - musiałem zaktualizować usługi Google w
build.gradle
folderze głównym projektudependencies { classpath 'com.google.gms:google-services:3.0.0' }
Możesz pobrać najnowszą aktualizację usług Google tutaj .
Chociaż nie omija wyjątku, ale nie powoduje już awarii aplikacji po mojej stronie.
Aktualizacja
Mogłem uniknąć awarii, aktualizując studio Android z Beta Channel. Następnie zaktualizuj swój
platform/build-tools
wewnętrzny SDK.źródło
Aktualizacja do najnowszej wersji usług Google Play rozwiązała problem.
zastosuj wtyczkę: „com.google.gms.google-services” na dole ...
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
źródło
9.0.0
też, ale nadal mam problem. Obecnie używam podzielonegogms
. :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
, ale wciąż ten sam problem.Zdarzyło mi się to z powodu aktualizacji Facebooka sdk i miałem
compile 'com.facebook.android:facebook-android-sdk:4.+'
zastępując go
compile 'com.facebook.android:facebook-android-sdk:4.15.0'
rozwiązał mój problem.
Odniesienie: https://developers.facebook.com/docs/android/change-log-4.x
źródło
Włączając wszystkie pakiety usług Play
dependencies { compile 'com.google.android.gms:play-services:9.0.0' }
pomijasz błąd, ale rezultatem końcowym jest to, że pobieranie tokenu GCM nie działa ani nie możemy uzyskać wystąpienia GCM. Więc to nie jest rozwiązanie w moich książkach. Jeśli ktoś ma pojęcie, co się dzieje, proszę nas oświecić.
EDYTOWAĆ:
Zastąpiłem GCM firebase, zaktualizowałem Android Studio z 2.1 do 2.2, aby rozwiązać problem z natychmiastowym uruchamianiem za pomocą analizy Firebase, zaktualizowałem narzędzia do kompilacji do 24-rc4, a narzędzia platformy do 24-rc3 i utrzymałem wersję bibliotek obsługi do 23.4.0. Wszystko wydaje się teraz działać dobrze.
źródło
Miałem ten sam problem i powrót z repozytorium wsparcia systemu Android 32.0.0 do repozytorium wsparcia systemu Android 31.0.0 rozwiązałem go.
źródło
W przypadku powiadomień push na Androida z GCM 2016:
1) w Android SDK-> SDK Tools sprawdź usługi Google Play
2) w gradle dodaj zależności tylko jedną linię:
compile 'com.google.android.gms:play-services-gcm:9.4.0'
(nie ma określonej ścieżki klas i u mnie działa)
3) musisz utworzyć klasę 3 (GCMPushReceiverService, GCMRegistrationIntentService, GCMTokenRefreshListenerService)
4.1) kod usługi 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) Kod dla GCMRegistrationIntentService (zmień autoryzowany podmiot na numer projektu):
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) Kod dla 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) Nie zapomnij zmienić nazwy pakietu
6) W swoim mainActivity wklej ten kod:
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) W pliku AndroidManifest.xml dodaj następujące wiersze:
<uses-permission android:name="android.permission.INTERNET" />
8) w logcat konsoli skopiuj token i wklej w tej witrynie dodaj numer projektu, token i wiadomość. U mnie działa dobrze :)
źródło
Po całym dniu mogę potwierdzić w 100%, że biblioteka Optimizely również w jakiś sposób koliduje i powoduje ten błąd. Mówiąc konkretnie, używam Optimizely przez Fabric. Niemożliwe jest zainicjowanie Firebase podczas korzystania z Optimizely w ten sposób (może na wszystkie sposoby?).
Napisałem o tym na ich githubie i skontaktuję się z nimi bezpośrednio ...
https://github.com/optimizely/Optimizely-Android-SDK/issues/11
źródło
Miałem ten sam problem. Zaktualizowałem narzędzia SDK do wersji 25.1.7 rc1, a następnie problem zniknął.
źródło
zaktualizowałem narzędzia SDK do wersji 25.1.7 i naprawiono ten problem.
źródło
Cóż, dopiero zaczynam korzystać z Androida. Chciałem przetestować tworzenie użytkowników
Firebase
zgodnie z instrukcjami, które są dostępne w witrynie Firebase.Dodałem te wiersze we wskazanych miejscach.
Ale metoda createUserWithEmailAndPassword nadal pokazywała błąd podczas tworzenia użytkowników. Dlatego odwiedziłem to pytanie, aby rozwiązać mój problem. Przeczytałem wszystkie i zastosowałem się do każdej rady. ale IT ciągle wykazywał niepowodzenie. Ale kiedy uaktualnię
Android Studio from 2.1.1 to 2.1.2
, mogłem pomyślnie tworzyć użytkowników.Ale kiedy sprawdziłem
logcat
, najpierw pokazał,"Firebase API initialization failure"
a potem pokazał „Inicjalizacja FirebaseApp powiodła się”.źródło
Napotkałem ten problem i zmieniam wersję aplikacji Gradle z 1.5.0 na 2.0.0.
zmień ścieżkę klasy
com.android.tools.build:gradle:1.5.0
do
classpath 'com.android.tools.build:gradle:2.0.0
źródło
Rozwiązanie 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` }
Rozwiązanie 2: Wykryj niezgodne w folderze .idie / libraries /. Kiedyś zadeklarujesz reklamy play-services: 8.4.0 jednocześnie z play-services-gcm: 9.0.0. Musisz nadpisać wykryte niezgodne biblioteki build.grade
źródło