【问题标题】:app crashing at FirebaseInstanceId.getInstance().getToken()应用程序在 FirebaseInstanceId.getInstance().getToken() 崩溃
【发布时间】:2017-12-31 14:23:20
【问题描述】:

我正在尝试通过在我的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(项目级别)

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.google.gms:google-services:3.1.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Build.gradle(应用级)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "com.simple.app"
        minSdkVersion 21
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

    compile ('com.android.support:appcompat-v7:25.0.1')
            {
                force=true
            }
    compile ('com.android.support.constraint:constraint-layout:1.0.2')
            {
                force=true
            }

    compile ('com.android.support:design:25.0.1')
            {
                force=true
            }
    compile 'com.firebaseui:firebase-ui:0.6.2'
    compile 'com.squareup.picasso:picasso:2.5.2'
    compile 'com.theartofdev.edmodo:android-image-cropper:2.4.+'
    compile ('com.android.support:support-v4:25.3.1')
            {
                force=true
            }
    compile ('com.google.firebase:firebase-messaging:9.2.0')
            {
                force=true
            }

    testCompile 'junit:junit:4.12'}
apply plugin: 'com.google.gms.google-services'

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)

【问题讨论】:

标签: java android


【解决方案1】:

java.lang.NoSuchMethodError: 没有静态方法 getNoBackupFilesDir(Landroid/content/Context;)Ljava/io/File;在班上 lcom/google/android/gms/common/util/zzx;

仅供参考

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

  • 从您的 build.gradle 依赖项部分中删除 support-v4:25.3.1
  • 然后Clean-Rebuild and Run

如果你使用最新版本会更好。

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'
    // ...
}

注意

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

监控令牌生成

正如关于Set up a Firebase cloud messaging client app on Android. 的官方指南所示:

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

示例

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

    // ...

}

【讨论】:

    【解决方案2】:

    将以下行添加到您的 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" />
    

    它在我的情况下有效....

    【讨论】:

      【解决方案3】:

      尽量使用相同版本的firebase SDK,也支持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,则可以修复它。

      【讨论】:

        猜你喜欢
        • 2021-08-04
        • 2019-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-10
        相关资源
        最近更新 更多