我正在尝试使用Firebase接收Android通知。我定义了以下服务。但是服务MyFirebaseInstanceIDService
首次运行时正在运行该应用程序。那时我什至没有用户数据库。我想为用户存储firebase令牌,但首先我要在第一个活动中为用户创建一个条目,并在第二个活动中启动服务。这样我就可以存储用户的令牌。
Android清单文件
<service
android:name="in.anamika.anamika.notifications.MyFirebaseMessagingService"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service android:name="in.anamika.anamika.notifications.MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
答案 0 :(得分:5)
根据我对您问题的理解,我看到了不止一种解决方案,如下所示:
更新后的API返回任务,您可以在其上添加onSuccess侦听器,并在成功获取令牌后将调用它。
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(yourActivity,
new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String deviceToken = instanceIdResult.getToken();
// Do whatever you want with your token now
// i.e. store it on SharedPreferences or DB
// or directly send it to server
}
});
请注意:不建议使用 FirebaseInstanceIdService ,我们可以重写onNewToken()以仅在FirebaseMessagingService中获取新的/更新的令牌。
您可以检查this链接。
答案 1 :(得分:3)
将此代码放入启动器/主要活动中:
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("", "Refreshed token: " + refreshedToken);
与进入Web下面的页面相比,这将为您提供令牌-
https://console.firebase.google.com/project/_/notification
和create new notification->choose single device->paste
在Android Studio项目中记录的令牌->检查是否收到通知
答案 2 :(得分:0)
注意:解决方案基于FirebaseInstanceIdService
和FirebaseMessagingService类。但它将与Firebase Android SDK的较新更新一起使用
以下是解决您的问题的方案:
在令牌刷新的回调中,首先检查FirebaseUser
是否
存在身份验证。如果存在,只需将令牌写入您的
Firebase数据库。同时将布尔值存储到“共享首选项”中
如果令牌保存在数据库中,则为true,否则将其设置为false。这解决了
问题是您没有数据库访问权限,但正在获取令牌。
接下来在单独的类中创建一个异步任务,只需调用
FirebaseInstanceId.getInstance().getToken();
触发
onTokenRefresh
投入使用。
firebase身份验证成功后,登录过程中的下一步将调用
异步任务之上,这将强制onTokenRefresh
回调。现在
由于存在用户身份验证,因此您对数据库的写入将成功(也
设置共享的首选项 token_sent_to_db = true)。
现在在您正在检查用户身份验证的启动活动中 导航到适当的活动,添加检查共享的首选项 token_sent_to_db = false;再次调用异步任务。这将确保,如果上述步骤中的某些步骤错过了将令牌保存到db中,我们可以 再次发送令牌。
最后,直到您强制将FCM的令牌更改为 更改或卸载应用程序。所以令牌只会得到 只能写入一次db。
P.S:还请确保在用户注销后,您使FCM令牌到期,否则服务器将继续向已注销的用户发送通知。 FirebaseInstanceId.getInstance()。deleteInstanceId();