我正在将Firebase Cloud消息集成到Android中
App 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'
apllication level 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。 所以我无法获得令牌。
即使是onNewToken
MyFirebaseMessagingService
也不会在应用程序中触发一次。
有人可以提前告诉我为什么我在这里FirebaseInstanceId.getInstance() null
感谢。
在这里,我正在尝试获取火力令牌
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();
}
});
}
经过长时间的研究,我发现清单文件中tools:node="replace"
使 FCM 不起作用。
将tools:node="replace"
更改为tools:node="merge"
通过此链接
https://github.com/firebase/quickstart-android/issues/477
尝试替换您的 Android 清单应用程序标记 具有以下属性
android:allowBackup="false" 工具:节点="合并" tools:replace="android:label,android:allowBackup">
在 UI 线程上FirebaseInstanceId.getInstance();
应该不是问题。我在 MainActivity 的 onCreate 方法中有以下内容,它运行良好(谷歌和其他人可能不推荐(:
FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(instance_id_completion_listener);
请尝试以下步骤:
将
implementation 'com.google.firebase:firebase-core:16.0.1'
添加到应用程序 build.gradle 文件。删除但备份与 Firebase 相关的所有清单条目。我的清单文件中没有任何内容,但是我只使用 Firebase 来获取实例 ID。
如果还没有这样做,请转到
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();
}
});
}
对我来说,AndroidManifest.xml
中缺少一个声明
<application ... >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
添加后,问题已解决。