It`s my first to use FCM.
I download a sample from firebase/quickstart-android and I install the FCM Quickstart.But I can`t get any token from the log even hit the LOG TOKEN button in the app.
Then I try to send message with Firebase console and set to target to my app package name.I got any incoming message.
I want to know can FCM be used?GCM everything is ok.
Solution:
Because I am not a Android developer,just a backend developer.So it takes me some time to solve it.In my opinion,there`re some bug in the sample app.
Code:
RegistrationIntentService.java
public class RegistrationIntentService extends IntentService {
private static final String TAG = "RegIntentService";
public RegistrationIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(Intent intent) {
String token = FirebaseInstanceId.getInstance().getToken();
Log.i(TAG, "FCM Registration Token: " + token);
}
}
MyFirebaseInstanceIDService.java
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
// [START refresh_token]
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
// String refreshedToken = FirebaseInstanceId.getInstance().getToken();
// Log.d(TAG, "Refreshed token: " + refreshedToken);
//
// // TODO: Implement this method to send any registration to your app's servers.
// sendRegistrationToServer(refreshedToken);
//
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
}
// [END refresh_token]
/**
* Persist token to third-party servers.
* <p>
* Modify this method to associate the user's FCM InstanceID token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private void sendRegistrationToServer(String token) {
// Add custom implementation, as needed.
}
}
Add this in the MainActivity.java.
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
After do above,you can get the Token in logcat.But finally I find a convenient way to get it.Just use debug mode to install the sample app and you can get the token when you first time to install it.
But I dont why it can
t print the log when I install it.Maybe be related to mobile system.
And then why I can`t get the Notification. FirebaseMessagingService.onMessageReceived did not call sendNotification
getToken() is deprecated. You can use getInstanceId() instead.
If you want to handle results when requesting instanceId(token), check this code.
If are using some auth function of firebase, you can take token using this:
Work well if user are logged. getCurrentUser()
According to doc
Migrate a GCM client app to FCM
So it will call only at first time when you install an app to your device.
So I suggest please uninstall your app manually and try to run again
definitely you will get TOKEN
In
firebase-messaging:17.1.0
and newer the FirebaseInstanceIdService is deprecated, you can get theonNewToken
on theFirebaseMessagingService
class as explained on https://stackoverflow.com/a/51475096/1351469But if you want to just get the token any time, then now you can do it like this:
Instead of this:
Do this:
And one more thing:
UPDATE:
New Firebase token is generated (
onTokenRefresh()
is called) when:FASTEST AND GOOD FOR PROTOTYPE
The quick solution is to store it in sharedPrefs and add this logic to
onCreate
method in your MainActivity or class which is extending Application.CLEANER WAY
A better option is to create a service and keep inside a similar logic. Firstly create new Service
And then add it to AndroidManifest file
Finally, you are able to use a static method from your Service
MyFirebaseMessagingService.getToken(Context);
THE FASTEST BUT DEPRECATED
It's still working when you are using older firebase library than version 17.x.x