希望大家都知道这个类,用于在刷新Firebase通知令牌时获取通知令牌,我们从此类中通过以下方法获取刷新的令牌。
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
要在实现FCM时使用它,我从FirebaseInstanceIdService
扩展了MyClass
但是,表明不赞成使用 FirebaseInstanceIdService
有人知道吗?, 我不建议使用什么方法或类代替它来获取刷新的令牌。
我正在使用:implementation 'com.google.firebase:firebase-messaging:17.1.0'
我检查了文档是否相同,对此没有提及。 :FCM SETUP DOCUMENT
更新
此问题已得到解决。
Google弃用了FirebaseInstanceService
,
我问了问题以找到方法,我知道我们可以从 FirebaseMessagingService 获取令牌,
和以前一样,当我问问题文档未更新但现在Google文档已更新以便获取更多信息时,请参阅此google文档:FirebaseMessagingService
OLD来自:FirebaseInstanceService(已弃用)
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
新来自:FirebaseMessagingService
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.d("NEW_TOKEN",s);
}
谢谢。
答案 0 :(得分:101)
Yes FirebaseInstanceIdService
is deprecated
FROM DOCS:-已弃用该类。 赞成
overriding onNewToken
中的FirebaseMessagingService
。一旦实施,就可以安全地删除此服务。
无需使用FirebaseInstanceIdService
服务来获取FCM令牌您可以安全地删除FirebaseInstanceIdService
服务
现在我们需要 @Override onNewToken
在Token
中获得FirebaseMessagingService
示例代码
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(String s) {
Log.e("NEW_TOKEN", s);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> params = remoteMessage.getData();
JSONObject object = new JSONObject(params);
Log.e("JSON_OBJECT", object.toString());
String NOTIFICATION_CHANNEL_ID = "Nilesh_channel";
long pattern[] = {0, 1000, 500, 1000};
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications",
NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setDescription("");
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.setVibrationPattern(pattern);
notificationChannel.enableVibration(true);
mNotificationManager.createNotificationChannel(notificationChannel);
}
// to diaplay notification in DND Mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = mNotificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID);
channel.canBypassDnd();
}
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
notificationBuilder.setAutoCancel(true)
.setColor(ContextCompat.getColor(this, R.color.colorAccent))
.setContentTitle(getString(R.string.app_name))
.setContentText(remoteMessage.getNotification().getBody())
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher_background)
.setAutoCancel(true);
mNotificationManager.notify(1000, notificationBuilder.build());
}
}
您需要像这样在清单文件中注册
FirebaseMessagingService
<service
android:name=".MyFirebaseMessagingService"
android:stopWithTask="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
.getToken();
也已弃用 如果您需要在活动中获得令牌,则可以使用getInstanceId ()
现在我们需要使用getInstanceId ()
来生成令牌
getInstanceId ()
返回此ID
项目的Firebase
并自动生成的令牌。
这将生成一个实例ID(如果尚不存在),并开始定期向Firebase后端发送信息。
返回
InstanceIdResult
来保存结果的任务,其中ID
和token
。示例代码
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String newToken = instanceIdResult.getToken();
Log.e("newToken",newToken);
}
});
这是kotlin的工作代码
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(p0: String?) {
}
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val NOTIFICATION_CHANNEL_ID = "Nilesh_channel"
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(NOTIFICATION_CHANNEL_ID, "Your Notifications", NotificationManager.IMPORTANCE_HIGH)
notificationChannel.description = "Description"
notificationChannel.enableLights(true)
notificationChannel.lightColor = Color.RED
notificationChannel.vibrationPattern = longArrayOf(0, 1000, 500, 1000)
notificationChannel.enableVibration(true)
notificationManager.createNotificationChannel(notificationChannel)
}
// to diaplay notification in DND Mode
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = notificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID)
channel.canBypassDnd()
}
val notificationBuilder = NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID)
notificationBuilder.setAutoCancel(true)
.setColor(ContextCompat.getColor(this, R.color.colorAccent))
.setContentTitle(getString(R.string.app_name))
.setContentText(remoteMessage!!.getNotification()!!.getBody())
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher_background)
.setAutoCancel(true)
notificationManager.notify(1000, notificationBuilder.build())
}
}
答案 1 :(得分:80)
firebaser here
检查reference documentation for FirebaseInstanceIdService
:
不推荐使用此类。
赞成在
<!DOCTYPE html> <html> <head> <title>soccertime</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div class="timeit" data-start="2018-7-1 14:00" data-end="2018-7-1 15:01"> <div class="time">TV2 - 14:00</div> <div class="teams">Spanien - Rusland</div> <div class="league">FIFA World Cup 2018 - 1/8 finale</div> </div> <div class="timeit" data-start="2018-7-1 14:35" data-end="2018-7-1 16:00"> <div class="time">Youtube - 17:35</div> <div class="teams">SK Sturm Graz - F.C. København</div> <div class="league">Træningskamp</div> </div> <div class="timeit" data-start="2018-7-1 17:35" data-end="2018-7-1 19:00"> <div class="time">DR1 - 19:00</div> <div class="teams">Kroatien - Danmark</div> <div class="league">FIFA World Cup 2018 - 1/8 finale</div> </div> <div class="timeit" data-start="2018-7-1 22:50" data-end="2018-7-2 01:00"> <div class="time">Eurosport2 - 19:00</div> <div class="teams">Toronto FC - New York Red Bulls</div> <div class="league">Major League Soccer</div> </div> <script type="text/javascript" src="jQuery.js"></script> <script type="text/javascript" src="timeit.js"></script> </body> </html>
中覆盖onNewToken
。一旦实施,就可以安全地删除此服务。
奇怪的是,FirebaseMessagingService
的JavaDoc还没有提到FirebaseMessagingService
方法。似乎并非所有更新的文档都尚未发布。我提出了一个内部问题,以获取对发布的参考文档的更新,并且也对指南中的示例进行了更新。
同时,旧的/已弃用的呼叫和新的呼叫均应正常工作。如果您遇到任何麻烦,请发布代码,然后看看。
答案 2 :(得分:9)
这:
FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()
假定是不推荐使用的解决方案:
FirebaseInstanceId.getInstance().getToken()
编辑
FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()
如果任务尚未完成,则可能会产生异常,因此,女巫Nilesh Rathod(用.addOnSuccessListener
描述的方法是正确的方法。
科特琳:
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(this) { instanceIdResult ->
val newToken = instanceIdResult.token
Log.e("newToken", newToken)
}
答案 3 :(得分:7)
只需调用此方法即可获取Firebase消息传递令牌
public void getFirebaseMessagingToken ( ) {
FirebaseMessaging.getInstance ().getToken ()
.addOnCompleteListener ( task -> {
if (!task.isSuccessful ()) {
//Could not get FirebaseMessagingToken
return;
}
if (null != task.getResult ()) {
//Got FirebaseMessagingToken
String firebaseMessagingToken = Objects.requireNonNull ( task.getResult () );
//Use firebaseMessagingToken further
}
} );
}
在build.gradle文件中添加此依赖项后,上述代码运行良好
implementation 'com.google.firebase:firebase-messaging:21.0.0'
注意:这是为解决上述依赖性而对上述依赖项进行的代码修改。 (截至2020年11月1日的工作代码)
答案 4 :(得分:2)
在KOTLIN中:-:如果要将令牌保存到数据库或共享首选项中,请在image
中覆盖onNewTokenoverride fun onNewToken(token: String?) {
super.onNewToken(token)
}
在运行时获取令牌,使用
FirebaseInstanceId.getInstance().instanceId
.addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
val mToken = instanceIdResult.token
println("printing fcm token: $mToken")
}
答案 5 :(得分:2)
Kotlin所提供的代码比其他答案中显示的更为简单。
要在刷新时获取新令牌:
class MyFirebaseMessagingService: FirebaseMessagingService() {
override fun onNewToken(token: String?) {
Log.d("FMS_TOKEN", token)
}
...
}
要在运行时从任何地方获取令牌:
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
Log.d("FMS_TOKEN", it.token)
}
答案 6 :(得分:2)
您必须使用FirebaseMessagingService()
而不是FirebaseInstanceIdService
答案 7 :(得分:2)
这里是 C#/Xamarin.Android 的解决方案:
var token = await FirebaseInstallations.Instance.GetToken(forceRefresh: false).AsAsync<InstallationTokenResult>();
答案 8 :(得分:0)
FCM实现类:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> data = remoteMessage.getData();
if(data != null) {
// Do something with Token
}
}
}
// FirebaseInstanceId.getInstance().getToken();
@Override
public void onNewToken(String token) {
super.onNewToken(token);
if (!token.isEmpty()) {
Log.e("NEW_TOKEN",token);
}
}
}
并在Activity或APP中调用其初始化:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(
instanceIdResult -> {
String newToken = instanceIdResult.getToken();
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.i("FireBaseToken", "onFailure : " + e.toString());
}
});
AndroidManifest.xml:
<service android:name="ir.hamplus.MyFirebaseMessagingService"
android:stopWithTask="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
**如果您添加了“ INSTANCE_ID_EVENT”,则别忘了禁用它。
答案 9 :(得分:0)
只需在build.gradle上添加它即可。 实施'com.google.firebase:firebase-messaging:20.2.3'
答案 10 :(得分:0)
改为使用FirebaseMessaging
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
if (!task.isSuccessful()) {
Log.w(TAG, "Fetching FCM registration token failed", task.getException());
return;
}
// Get new FCM registration token
String token = task.getResult();
// Log and toast
String msg = getString(R.string.msg_token_fmt, token);
Log.d(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
答案 11 :(得分:0)
对于Kotlin,我使用以下内容
val fcmtoken = FirebaseMessaging.getInstance().token.await()
以及扩展功能
public suspend fun <T> Task<T>.await(): T {
// fast path
if (isComplete) {
val e = exception
return if (e == null) {
if (isCanceled) {
throw CancellationException("Task $this was cancelled normally.")
} else {
@Suppress("UNCHECKED_CAST")
result as T
}
} else {
throw e
}
}
return suspendCancellableCoroutine { cont ->
addOnCompleteListener {
val e = exception
if (e == null) {
@Suppress("UNCHECKED_CAST")
if (isCanceled) cont.cancel() else cont.resume(result as T)
} else {
cont.resumeWithException(e)
}
}
}
}
答案 12 :(得分:0)
getInstance().getInstanceId()
现在也已弃用,FirebaseInstallations
现在正在使用。
FirebaseInstallations.getInstance().getToken(forceRefresh: false).addOnCompleteListener { task ->
if (task.isSuccessful) {
val token = task.result.token
// do stuff with token
} else {
showAlert(R.string.token, R.string.error_fetching_token, null)
}
}
答案 13 :(得分:0)
首先导入 import com.google.firebase.messaging.FirebaseMessaging;
然后
只需使用 FirebaseMessaging.getInstance().getToken().getResult();
而不是 FirebaseInstanceId.getInstance().getToken().getresult()
就是这样。
答案 14 :(得分:-1)
def __init__(self, *args, **kwargs):
self.cuestionario = kwargs.pop('cuestionario', False)
super(PreguntaForm, self).__init__(*args, **kwargs)
self.fields['grupo'].queryset = Grupo.objects.filter(cuestionario=self.cuestionario)
def clean(self):
# do something with self.cuestionario
已过时。
因此必须使用“ FirebaseMessagingService”
请海图片:
implementation 'com.google.firebase:firebase-auth:16.0.1' //delete 15.0.0