Android SDK Tools 25.1.6およびAndroid Support Repository 32.0.0(今朝)に更新したため、次のエラーが発生しました。コードを変更せず、同僚のコンピューターで引き続き動作しています(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)
クラッシュするコードは次のとおりです。
InstanceID instanceID = InstanceID.getInstance(this); // <-- crash here
String instanceIDToken = instanceID.getToken(getString(R.string.google_app_id),
GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
Google Cloud Messagingからトークンを取得しようとしたときです。
私は、分割されたプレイサービスでGradleにGCMをインポートしています:
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'
EDIT GCMを無効にすると問題が修正されたため、Firebase Cloud Messageに移行する必要があると思います
EDIT2デバイスはGoogle Play Services 9.0を受け取ります(昨日は8.4.xでした)。今ではもうクラッシュしませんが、モジュール記述子について文句を言います
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.
誰もが同様のエラーを持っていますか?それを修正する方法は?
FIXED @stegranetに感謝します。 ./gradlew -q app:dependencies --configuration compile
は、SDK 24.xを含む依存関係を識別するのに役立ちます
主な問題は、バージョンの代わりに+
記号を使用して最新のサポートライブラリをインポートするライブラリです。これにより、利用可能な最新バージョンを含めることで問題が発生します。
したがって、+
サインイン依存関係は避けてください;)
Gradle依存関係ツリーを使用して、このエラーを解決しました。
gradle -q app:dependencies --configuration compile
を実行し、次のようなエントリの出力を確認します。
+--- com.mcxiaoke.viewpagerindicator:library:2.4.1
| \--- com.Android.support:support-v4:+ -> 24.0.0-beta1 (*)
Diego Giorgini は、このバージョンは高すぎる(> = 24)と述べています。そのため、build.gradle
の依存関係を次のように更新します
compile('com.mcxiaoke.viewpagerindicator:library:2.4.1') {
exclude module: 'support-v4';
}
compile 'com.Android.support:support-v4:23.4.0'
更新5月27日:
最初の編集で言及した非互換性を修正するためのアップデート(version 9.0.1
)をリリースしました。
依存関係を更新し、これがまだ問題であるかどうかをお知らせください。
ありがとう!
元の回答5月20日:
発生している問題は、以下の間に互換性がないためですplay-services / firebase sdk v9.0.0
およびcom.Android.support:appcompat-v7 >= 24
(Android-N SDKでリリースされたバージョン)
サポートライブラリの以前のバージョンを対象とすることで、修正できるはずです。のような:
compile 'com.Android.support:appcompat-v7:23.4.0'
build.gradle
のplay-services依存関係を更新しました
dependencies {
compile 'com.google.Android.gms:play-services:9.0.0'
}
Google-servicesプラグインのバージョンを更新してバージョンの競合を修正するには、プロジェクトのルートフォルダーの下のbuild.gradle
でgoogle-servicesを更新する必要がありました。
dependencies {
classpath 'com.google.gms:google-services:3.0.0'
}
Google-services here の最新のアップデートを入手できます。
例外を回避するわけではありませんが、私の側ではもうアプリケーションをクラッシュさせません。
更新
ベータチャネルからAndroidスタジオを更新することで、クラッシュを回避できました。次に、SDK内でplatform/build-tools
を更新します。
私の仕事は次のとおりです。
アプリレベルのグラドル
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'
}
ルートレベルのグラドル
dependencies {
classpath 'com.google.gms:google-services:3.0.0'
}
最新のGoogle Playサービスバージョンに更新すると、問題が修正されました。
プラグインの適用:下部の「com.google.gms.google-services」...
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
FacebookでSDKを更新したために私に起こりました
compile 'com.facebook.Android:facebook-Android-sdk:4.+'
に置き換える
compile 'com.facebook.Android:facebook-Android-sdk:4.15.0'
私の問題を解決しました。
参照: https://developers.facebook.com/docs/Android/change-log-4.x
すべてのPlayサービスのパッケージを含めることにより
dependencies {
compile 'com.google.Android.gms:play-services:9.0.0'
}
エラーを抑制しますが、最終結果は、GCMトークンの取得が機能せず、GCMのインスタンスを取得できないことです。したがって、これは私の本では解決策ではありません。何が起こっているのか誰にもわからない場合は、教えてください。
編集:
GCMをfirebaseに置き換え、Android studioを2.1から2.2に更新してfirebase分析のインスタントランの問題を修正し、ビルドツールを24-rc4に、プラットフォームツールを24-rc3に更新し、サポートライブラリを保持しました。 23.4.0へのバージョン。すべてがうまく機能しているようです。
GCM 2016のAndroidプッシュ通知の場合:
1)Android SDK-> SDK ToolsでGoogle Playサービスを確認します
2)gradleに依存関係を1行だけ追加します。
compile 'com.google.Android.gms:play-services-gcm:9.4.0'
(特定のクラスパスはなく、私にとってはうまくいきます)
3)3つのクラス(GCMPushReceiverService、GCMRegistrationIntentService、GCMTokenRefreshListenerService)を作成する必要があります
4.1)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)GCMRegistrationIntentServiceのコード(authorizedEntityをプロジェクト番号に変更):
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)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)パッケージ名を変更することを忘れないでください
6)mainActivityにこのコードを貼り付けます:
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)AndroidManifest.xmlに次の行を追加します。
<uses-permission Android:name="Android.permission.INTERNET" />
8)コンソールのlogcatでトークンをコピーして、これに貼り付けます site プロジェクト番号、トークン、メッセージを追加します。私にとってはうまくいきます:)
同じ問題が発生し、Android Support Repository 32.0.0からAndroid Support Repository 31.0.0に戻すことで解決しました。
私はこの問題に直面しており、アプリのgradleバージョンを1.5.0から2.0.0に変更します。
クラスパスを変更する
com.Android.tools.build:gradle:1.5.0
に
classpath 'com.Android.tools.build:gradle:2.0.0
これで1日を過ごした後、Optimizelyライブラリも何らかの方法で衝突し、このエラーを引き起こしていることを100%確認できます。具体的には、Optimizely by Fabricを使用しています。この方法でOptimizelyを使用している間(おそらくすべての方法で)Firebaseを初期化することは不可能です。
私は彼らのgithubにそれについて投稿しており、彼らに直接連絡します...
https://github.com/optimizely/Optimizely-Android-SDK/issues/11
まあ、私はAndroidを使用する初心者です。 Firebase Webサイトで提供されている指示に従ってFirebase
でユーザーの作成をテストしたかったのです。
これらの行を指定された場所に追加しました。
クラスパス 'com.google.gms:google-services:3.0.0'
'com.google.firebase:firebase-auth:9.2.0'をコンパイルします
プラグインの適用: 'com.google.gms.google-services'
ただし、createUserWithEmailAndPasswordメソッドは、ユーザーの作成中にエラーを表示し続けました。だから、私はこの質問にアクセスして問題を解明しました。私はすべてを読み、各アドバイスを適用しました。しかし、ITは失敗を示し続けました。しかし、Android Studio from 2.1.1 to 2.1.2
をアップグレードすると、ユーザーを正常に作成できました。
しかし、logcat
をチェックすると、最初に"Firebase API initialization failure"
が表示され、次に「FirebaseAppの初期化に成功しました」と表示されました。
07-09 18:53:37.012 13352-13352/jayground.firebasetest A/FirebaseApp: Firebase API initialization failure. How can I solve
この? Java.lang.reflect.Method.invokeNative(Native Method)のJava.lang.reflect.InvocationTargetExceptionで、com.google.firebase.FirebaseApp.zza(UnknownのJava.lang.reflect.Method.invoke(Method.Java:515)でSource)com.google.firebase.FirebaseApp.initializeApp(Unknown Source)at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)at com.google.firebase.FirebaseApp.zzeh(Unknown Source)at com.google.firebase .provider.FirebaseInitProvider.onCreate(Unknown Source)at Android.content.ContentProvider.attachInfo(ContentProvider.Java:1591)at Android.content.ContentProvider.attachInfo(ContentProvider.Java:1562)at com.google.firebase.provider.FirebaseInitProvider .attachInfo(Unknown Source)at Android.app.ActivityThread.installProvider(ActivityThread.Java:5118)at Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4713)at Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4596 )Android.app.ActivityThread.access $ 1600(ActivityThread.Java:169)at And roid.app.ActivityThread $ H.handleMessage(ActivityThread.Java:1340)at Android.os.Handler.dispatchMessage(Handler.Java:102)at Android.os.Looper.loop(Looper.Java:146)at Android.app .ActivityThread.main(ActivityThread.Java:5487)at Java.lang.reflect.Method.invokeNative(Native Method)at Java.lang.reflect.Method.invoke(Method.Java:515)at com.Android.internal.os .ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.Java:1283)at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1099)at dalvik.system.NativeStart.main(Native Method)原因:Java.lang .NoSuchMethodError:com.google.Android.gms.measurement.AppMeasurementのcom.google.Android.gms.measurement.internal.zzx.zzbd(Unknown Source)のcom.google.Android.gms.common.internal.zzaa.zzz .getInstance(Unknown Source)at Java.lang.reflect.Method.invokeNative(Native Method)at Java.lang.reflect.Method.invoke(Method.Java:515)at com.google.firebase.FirebaseApp.zza(Unknown Source )com.google.firebase.FirebaseApp.initializeAppで(Unknown S ource)com.google.firebase.FirebaseApp.initializeApp(Unknown Source)でcom.google.firebase.FirebaseApp.zzeh(Unknown Source)でcom.google.firebase.provider.FirebaseInitProvider.onCreate(Unknown Source)でAndroid.contentで.ContentProvider.attachInfo(ContentProvider.Java:1591)Android.content.ContentProvider.attachInfo(ContentProvider.Java:1562)at com.google.firebase.provider.FirebaseInitProvider.attachInfo(Unknown Source)Android.app.ActivityThread.installProvider (ActivityThread.Java:5118)Android.app.ActivityThread.installContentProviders(ActivityThread.Java:4713)Android.app.ActivityThread.handleBindApplication(ActivityThread.Java:4596)Android.app.ActivityThread.access $ 1600(ActivityThread.Java) :169)Android.app.ActivityThread $ H.handleMessage(ActivityThread.Java:1340)Android.os.Handler.dispatchMessage(Handler.Java:102)Android.os.Looper.loop(Looper.Java:146) Android.app.ActivityThread.main(ActivityThread.Java:5487)Java.lでang.reflect.Method.invokeNative(Native Method)at Java.lang.reflect.Method.invoke(Method.Java:515)at com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.Java:1283) com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:1099)dalvik.system.NativeStart.main(Native Method)で07-09 18:53:37.022 13352-13352/jayground.firebasetest I/FirebaseInitProvider:FirebaseApp初期化成功
sDKツールを25.1.7に更新し、この問題を修正しました。
解決策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`
}
解決策2:フォルダー.idie/libraries /で互換性がないことを検出するplay-services-ads:8.4.0をplay-services-gcm:9.0.0と同時に宣言する場合
同じ問題がありました。 SDKツールを25.1.7 rc1に更新すると、問題はなくなりました。