Java FirebaseInstanceId.getInstance().getToken()上的应用程序崩溃

Java FirebaseInstanceId.getInstance().getToken()上的应用程序崩溃,java,android,Java,Android,我试图通过在我的MainActivity.java中使用FirebaseInstanceId.getInstance().getToken()来获取令牌,但是当我使用此方法获取令牌时,应用程序会崩溃。 这是我的onCreate()方法 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.a

我试图通过在我的
MainActivity.java中使用
FirebaseInstanceId.getInstance().getToken()
来获取令牌,但是当我使用此方法获取令牌时,应用程序会崩溃。

这是我的onCreate()方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toast.makeText(MainActivity.this, FirebaseInstanceId.getInstance().getToken(), Toast.LENGTH_SHORT).show();
}
Build.gradle(项目级)

Build.gradle(应用程序级)

Logcat

07-25 20:25:20.903 4563-4563/com.simple.app D/AndroidRuntime: Shutting down VM
07-25 20:25:20.907 4563-4563/com.simple.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.simple.app, PID: 4563
java.lang.NoSuchMethodError: No static method getNoBackupFilesDir(Landroid/content/Context;)Ljava/io/File; in class Lcom/google/android/gms/common/util/zzx; or its super classes (declaration of 'com.google.android.gms.common.util.zzx' appears in /data/app/com.simple.app-2/split_lib_dependencies_apk.apk:classes42.dex)
    at com.google.firebase.iid.zzg.zzkg(Unknown Source)
    at com.google.firebase.iid.zzg.<init>(Unknown Source)
    at com.google.firebase.iid.zzg.<init>(Unknown Source)
    at com.google.firebase.iid.zzd.zzb(Unknown Source)
    at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source)
    at com.google.firebase.iid.FirebaseInstanceId.getInstance(Unknown Source)
    at com.simple.app.MainActivity.onCreate(MainActivity.java:138)
    at android.app.Activity.performCreate(Activity.java:6237)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
    at android.app.ActivityThread.-wrap11(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5417)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
07-25 20:25:20.903 4563-4563/com.simple.app D/AndroidRuntime:关闭虚拟机
07-25 20:25:20.907 4563-4563/com.simple.app E/AndroidRuntime:致命异常:main
进程:com.simple.app,PID:4563
java.lang.NoSuchMethodError:没有静态方法getNoBackupFilesDir(Landroid/content/Context;)Ljava/io/File;课堂上的Lcom/google/android/gms/common/util/zzx;或者它的超类(声明'com.google.android.gms.common.util.zzx'出现在/data/app/com.simple.app-2/split_lib_dependencies_apk.apk:classes42.dex中)
网址:com.google.firebase.iid.zzg.zzkg(未知来源)
在com.google.firebase.iid.zzg(未知来源)
在com.google.firebase.iid.zzg(未知来源)
在com.google.firebase.iid.zzd.zzb(未知来源)
位于com.google.firebase.iid.FirebaseInstanceId.getInstance(未知源)
位于com.google.firebase.iid.FirebaseInstanceId.getInstance(未知源)
位于com.simple.app.MainActivity.onCreate(MainActivity.java:138)
位于android.app.Activity.performCreate(Activity.java:6237)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
位于android.app.ActivityThread.-wrap11(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:148)
位于android.app.ActivityThread.main(ActivityThread.java:5417)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run上(ZygoteInit.java:726)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

尝试使用相同版本的firebase SDK和support SDK

检查依赖关系树:

./gradlew :{yourappmodulename}:dependencies --configuration compile
如果选中该树,您将看到不同的版本:

  • Firebase:9.2.0和9.8.0
  • 支持SDK:25.0.1和25.3.1
如果将firebase更新为9.8.0并将SDK支持更新为25.3.1,则可以修复此问题

java.lang.NoSuchMethodError:没有静态方法 getnobackfilesdir(Landroid/content/Context;)Ljava/io/File;课堂上 Lcom/google/android/gms/common/util/zzx

FYI

ASAIK
getNoBackupFilesDir
出现在
android.support.v4.content.ContextCompat.

  • 从build.gradle依赖项部分删除support-v4:25.3.1
  • 然后清理重建并运行
  • 如果你使用最新版本会更好

    android {
        // ...
    
        compileSdkVersion 26
        buildToolsVersion '26.0.1'
    
        defaultConfig {
            targetSdkVersion 26
        }
    
        // ...
     }
    

    注意

    FirebaseInstanceId.getInstance().getToken()
    调用以检索当前令牌。如果尚未创建令牌,则为null 返回

    监视令牌生成 正如有关的官方指南所示:

    “每当生成新令牌时,
    onTokenRefreshcallback
    就会触发,因此在其上下文中调用
    getToken
    可确保您正在访问当前可用的注册令牌。请确保已将服务添加到您的中,然后在
    onTokenRefresh
    上下文中调用
    getToken
    ,并记录值。”(……)”

    例子
    将以下行添加到AndroidManifest.xml

    <service android:name="com.google.firebase.components.ComponentDiscoveryService" >
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.iid.Registrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
    
    
    


    它在我的情况下起作用了….

    您是否使用FirebaseInstancedService和FirebaseMessagingService类来创建令牌或处理通知事件??
    android {
        // ...
    
        compileSdkVersion 26
        buildToolsVersion '26.0.1'
    
        defaultConfig {
            targetSdkVersion 26
        }
    
        // ...
     }
    
    repositories {
        maven { url 'https://maven.google.com' }
    }
    
    dependencies {
        // ...
        compile 'com.android.support:appcompat-v7:26.1.0'
        compile 'com.android.support:support-compat:26.1.0'
        compile 'com.google.firebase:firebase-messaging:11.4.2'
        // ...
    }
    
    public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
    
        private static final String TAG = "MyFirebaseIIDService";
    
        /**
         * Called if InstanceID token is updated. This may occur if the security of
         * the previous token had been compromised. Note that this is called when the InstanceID token
         * is initially generated so this is where you would retrieve the token.
         */
        @Override
        public void onTokenRefresh() {
            // Get updated InstanceID token.
            String refreshedToken = FirebaseInstanceId.getInstance().getToken();
            Log.d(TAG, "Refreshed token: " + refreshedToken);
    
            // If you want to send messages to this application instance or
            // manage this apps subscriptions on the server side, send the
            // Instance ID token to your app server.
            sendRegistrationToServer(refreshedToken);
        }
    
        // ...
    
    }
    
    <service android:name="com.google.firebase.components.ComponentDiscoveryService" >
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.iid.Registrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />