'FirebaseInstanceIdService is deprecated
Hope all of you aware of this class, used to get notification token whenever firebase notification token got refreshed we get the refreshed token from this class, From following method.
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
To use this as i want to implement FCM, I extended MyClass from FirebaseInstanceIdService
But, Showing that FirebaseInstanceIdService is deprecated
Does anybody know this?, What method or class i should use instead of this to get refreshed token as this is deprecated.
I'm using : implementation 'com.google.firebase:firebase-messaging:17.1.0'
I checked the document for same there is nothing mentioned about this. : FCM SETUP DOCUMENT
UPDATE
This issue has been Fixed.
As Google deprecated the FirebaseInstanceService,
I asked the question to find the way and i get to know that We can get the Token from FirebaseMessagingService,
As before, when i asked the Question Documents were not updated but Now Google docs updated so for more info, Refer this google doc : FirebaseMessagingService
OLD From : FirebaseInstanceService (Deprecated)
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
}
NEW From : FirebaseMessagingService
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.d("NEW_TOKEN",s);
}
Thanks.
Solution 1:[1]
Update 11-12-2020
Now FirebaseInstanceId is also deprectaed
Now we need to use FirebaseMessaging.getInstance().token
SAMPLE CODE
FirebaseMessaging.getInstance().token.addOnCompleteListener {
if(it.isComplete){
firebaseToken = it.result.toString()
Util.printLog(firebaseToken)
}
}
Yes FirebaseInstanceIdService is deprecated
FROM DOCS :- This class was deprecated. In favour of
overriding onNewTokeninFirebaseMessagingService. Once that has been implemented, this service can be safely removed.
No need to use FirebaseInstanceIdService service to get FCM token You can safely remove FirebaseInstanceIdService service
Now we need to @Override onNewToken get Token in FirebaseMessagingService
SAMPLE CODE
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());
}
}
#EDIT
You need to register your
FirebaseMessagingServicein manifest file like this
<service
android:name=".MyFirebaseMessagingService"
android:stopWithTask="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
#how to get token in your activity
.getToken();is also deprecated if you need to get token in your activity than UsegetInstanceId ()
Now we need to use getInstanceId () to generate token
getInstanceId () Returns the ID and automatically generated token for this Firebase project.
This generates an Instance ID if it does not exist yet, which starts periodically sending information to the Firebase backend.
Returns
- Task which you can use to see the result via the
InstanceIdResultwhich holds theIDandtoken.
SAMPLE CODE
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( MyActivity.this, new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String newToken = instanceIdResult.getToken();
Log.e("newToken",newToken);
}
});
##EDIT 2
Here is the working code for 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())
}
}
Solution 2:[2]
And this:
FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()
suppose to be solution of deprecated:
FirebaseInstanceId.getInstance().getToken()
EDIT
FirebaseInstanceId.getInstance().getInstanceId().getResult().getToken()
can produce exception if the task is not yet completed, so the method witch Nilesh Rathod described (with .addOnSuccessListener) is correct way to do it.
Kotlin:
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(this) { instanceIdResult ->
val newToken = instanceIdResult.token
Log.e("newToken", newToken)
}
Solution 3:[3]
Simply call this method to get the Firebase Messaging Token
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
}
} );
}
The above code works well after adding this dependency in build.gradle file
implementation 'com.google.firebase:firebase-messaging:21.1.0'
Note: This is the code modification done for the above dependency to resolve deprecation. (Working code as of 9th May 2021)
Solution 4:[4]
FirebaseinstanceIdService is deprecated.
So have to use "FirebaseMessagingService"
Sea the image please:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.e("NEW_TOKEN",s);
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
}
}
Solution 5:[5]
Kotlin allows for even simpler code than what's shown in other answers.
To get the new token whenever it's refreshed:
class MyFirebaseMessagingService: FirebaseMessagingService() {
override fun onNewToken(token: String?) {
Log.d("FMS_TOKEN", token)
}
...
}
To get the token from anywhere at runtime:
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener {
Log.d("FMS_TOKEN", it.token)
}
Solution 6:[6]
In KOTLIN:- If you want to save Token into DB or shared preferences then override onNewToken in FirebaseMessagingService
override fun onNewToken(token: String) {
super.onNewToken(token)
}
Get token at run-time,use
FirebaseInstanceId.getInstance().instanceId
.addOnSuccessListener(this@SplashActivity) { instanceIdResult ->
val mToken = instanceIdResult.token
println("printing fcm token: $mToken")
}
Solution 7:[7]
FCM implementation Class:
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);
}
}
}
And call its initialize in Activity or 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>
**If you added "INSTANCE_ID_EVENT" don't forget to disable it.
Solution 8:[8]
You have to use FirebaseMessagingService() instead of FirebaseInstanceIdService
Solution 9:[9]
And here the solution for C#/Xamarin.Android:
var token = await FirebaseInstallations.Instance.GetToken(forceRefresh: false).AsAsync<InstallationTokenResult>();
Solution 10:[10]
getInstance().getInstanceId() is also now deprecated and FirebaseMessaging is being used now.
FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (task.isSuccessful) {
val token = task.result
} else {
Timber.e(task.exception)
}
}
Solution 11:[11]
First import import com.google.firebase.messaging.FirebaseMessaging;
then
Simply use FirebaseMessaging.getInstance().getToken().getResult(); instead of FirebaseInstanceId.getInstance().getToken().getresult()
That's it.
Solution 12:[12]
You can use service
<service android:name=".utils.fcm.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
public class MyFirebaseMessagingService extends FirebaseMessagingService{
@Override
public void onNewToken(String s) {
super.onNewToken(s);
Log.e("NEW_TOKEN = = == = = =",s);
}
}
If you want to use in Activity
FirebaseMessaging.getInstance ().getToken ().addOnCompleteListener ( task -> {
Log.e("spalsh",task.getResult());
});
Solution 13:[13]
Just Add This On build.gradle. implementation 'com.google.firebase:firebase-messaging:20.2.3'
Solution 14:[14]
Use FirebaseMessaging instead
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();
}
});
Solution 15:[15]
For kotlin I use the following
val fcmtoken = FirebaseMessaging.getInstance().token.await()
and for the extension functions
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)
}
}
}
}
Solution 16:[16]
You can use this method in your activity , this worked for me.
private void registerInBackground() {
FirebaseApp.initializeApp(SplashActivity.this);
FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener<String>() {
@Override
public void onComplete(@NonNull Task<String> task) {
String token = task.getResult();
}
});
}
Solution 17:[17]
From com.google.firebase:firebase-bom:28.4.2 , the way to do it is as such:
FirebaseMessaging.getInstance().token.result
Since this is a Task, though, it doesn't return the value this way. You need to wait for it using a callback.
A nice way to solve it is via this:
@WorkerThread
fun <TResult> Task<TResult>.awaitForResult(): Task<TResult> {
val countDownLatch = CountDownLatch(1)
this.addOnCompleteListener {
countDownLatch.countDown()
}
countDownLatch.await()
return this
}
@WorkerThread
fun <TResult> Task<TResult>.awaitForResultOrNull(): Task<TResult>? {
val task = awaitForResult()
return if (task.isSuccessful)
return task else null
}
So example usage:
val regId : String? = FirebaseMessaging.getInstance().token.awaitForResultOrNull()?.result
Solution 18:[18]
The new way
FirebaseMessaging.getInstance().getToken().addOnCompleteListener(task -> Log.e(TAG, "Token: "+task.getResult()));
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow

