FirebaseInstanceId.getInstance() 返回 null。

6
我正在将Firebase Cloud Messaing集成到Android中。
应用的build.gradle文件如下所示。
implementation 'com.google.firebase:firebase-auth:16.0.3'
implementation 'com.google.firebase:firebase-messaging:17.3.3'
implementation 'com.google.android.gms:play-services-auth:16.0.0'


apply plugin: 'com.google.gms.google-services'

在应用级别的build.gradle文件中,类路径为:
dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath 'com.google.gms:google-services:4.0.1'
    }

我的清单大致如下

<service android:name=".firebase.MyFirebaseMessagingService">
       <intent-filter>
          <action android:name="com.google.firebase.MESSAGING_EVENT" />
       </intent-filter>
  </service>
       <meta-data
        android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/ic_artize_a" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="@string/default_notification_channel_id" />

我遇到的问题是当我尝试获取 FirebaseInstanceId.getInstance() 时,它返回 null。所以我无法获取 Token。

即使在应用程序中,MyFirebaseMessagingServiceonNewToken 也没有被触发。

有人能告诉我为什么在这里我会得到 FirebaseInstanceId.getInstance() null 吗?谢谢提前。

这里我正在尝试获取 Firebase token。

private void getFirebaseToken(){
        FirebaseInstanceId firebaseInstanceId = FirebaseInstanceId.getInstance();
        if(firebaseInstanceId == null){
            return;
        }


        firebaseInstanceId.getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    return;
                }

                // Get new Instance ID token
                String token = task.getResult().getToken();

            }
        });
    }

1
展示你的代码中调用 FirebaseInstanceId.getInstance() 的位置。 - m0skit0
@m0skit0 我正在添加我的代码到问题中的 getFirebasecode 函数。 - Navin Gupta
1
@m0skit0,我尝试了两种方法。第一次我在AsyncTask的doInBackground中调用了这个方法,但它没有起作用,然后我创建了一个线程并调用了这个方法,但它仍然没有起作用............... - Navin Gupta
1
@NavinGupta 我也遇到了同样的问题,你找到任何解决方案了吗? - alphaguy
还要确保您的手机上已安装GooglePlay。GoogleApiAvailability.getInstance().makeGooglePlayServicesAvailable(); - Mysterious_android
显示剩余8条评论
4个回答

7

3
尝试将Android清单应用程序标签中的以下属性替换为:
android:allowBackup="false" tools:node="merge" tools:replace="android:label,android:allowBackup"
这样可以保留HTML标记,使内容更加易懂。

谢谢Vinoth!你知道是什么原因导致的吗? - JerabekJakub
@JerabekJakub 当你构建apk文件时,gradle没有在Android清单文件中包含内容提供程序(FirebaseInitProvider类)。 - Vinoth M

0

在UI线程上使用FirebaseInstanceId.getInstance();不应该是一个问题。我在MainActivity的onCreate方法中有以下代码,它可以完美地工作(可能不被Google和其他人推荐):

FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(instance_id_completion_listener);

请尝试以下步骤:

  1. implementation 'com.google.firebase:firebase-core:16.0.1' 添加到应用程序的 build.gradle 文件中。

  2. 移除与 Firebase 相关的所有清单条目,但要备份这些内容。虽然我只是使用 Firebase 获取实例 ID ,但我的清单文件中没有任何 Firebase 条目。

  3. 如果您还没有这样做,请访问 https://firebase.google.com/docs/android/setup 并将 Firebase 添加到您的 Android 项目中。

您也可以尝试以下操作:

private void getFirebaseToken(){

    FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
        @Override
        public void onComplete(@NonNull Task<InstanceIdResult> task) {
            if (!task.isSuccessful()) {
                return;
            }

            Log.d("getFirebaseToken", "Successful");

            // Get new Instance ID token
            String token = task.getResult().getToken();

        }
    });
}

仅限于测试目的,因为在UI线程上使用这不是个好主意,可以尝试以下操作:
private void getFirebaseToken(){
    FirebaseInstanceId firebaseInstanceId = FirebaseInstanceId.getInstance();

    try
    {
        Thread.sleep(2000);
    } 
    catch (InterruptedException e)
    {
        e.printStackTrace();
    }

    if(firebaseInstanceId == null){
        return;
    }


    firebaseInstanceId.getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
        @Override
        public void onComplete(@NonNull Task<InstanceIdResult> task) {
            if (!task.isSuccessful()) {
                return;
            }

            // Get new Instance ID token
            String token = task.getResult().getToken();

        }
    });
}

0

对我来说,在AndroidManifest.xml中缺少了一个声明。

<application ... >

    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

添加后,问题得到解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接