Po raz pierwszy używam FCM.
Pobieram próbkę z firebase / quickstart-android i instaluję FCM Quickstart. Ale nie mogę pobrać żadnego tokena z dziennika, nawet naciskając przycisk LOG TOKEN w aplikacji.
Następnie próbuję wysłać wiadomość za pomocą konsoli Firebase i ustawiam docelową nazwę mojego pakietu aplikacji. Otrzymałem wiadomości.
Chcę wiedzieć, czy można używać FCM? GCM wszystko jest w porządku.
Rozwiązanie:
Ponieważ nie jestem programistą Androida, tylko programistą zaplecza. Więc rozwiązanie tego zajmuje mi trochę czasu. Moim zdaniem w przykładowej aplikacji jest kilka błędów.
Kod:
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.
}
}
Dodaj to w pliku MainActivity.java.
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
Po wykonaniu powyższych , otrzymasz Token w Logcat. Ale w końcu znajduję wygodny sposób, aby to zdobyć. Po prostu użyj trybu debugowania, aby zainstalować przykładową aplikację, a token możesz uzyskać podczas pierwszej instalacji.
Ale nie wiem, dlaczego nie może wydrukować dziennika po zainstalowaniu. Może mieć związek z systemem mobilnym.
A potem dlaczego nie mogę otrzymać powiadomienia. FirebaseMessagingService.onMessageReceived nie wywołał sendNotification
String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
Odpowiedzi:
NAJSZYBSZY I DOBRY DO PROTOTYPU
Szybkim rozwiązaniem jest zapisanie go w sharedPrefs i dodanie tej logiki do
onCreate
metody w MainActivity lub klasie rozszerzającej Application.FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(this, instanceIdResult -> { String newToken = instanceIdResult.getToken(); Log.e("newToken", newToken); getActivity().getPreferences(Context.MODE_PRIVATE).edit().putString("fb", newToken).apply(); }); Log.d("newToken", getActivity().getPreferences(Context.MODE_PRIVATE).getString("fb", "empty :("));
CZYSTSZY SPOSÓB
Lepszą opcją jest stworzenie usługi i trzymanie się podobnej logiki. Najpierw utwórz nową usługę
public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String s) { super.onNewToken(s); Log.e("newToken", s); getSharedPreferences("_", MODE_PRIVATE).edit().putString("fb", s).apply(); } @Override public void onMessageReceived(RemoteMessage remoteMessage) { super.onMessageReceived(remoteMessage); } public static String getToken(Context context) { return context.getSharedPreferences("_", MODE_PRIVATE).getString("fb", "empty"); } }
A następnie dodaj go do pliku AndroidManifest
<service android:name=".MyFirebaseMessagingService" android:stopWithTask="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Wreszcie możesz użyć metody statycznej z usługi
MyFirebaseMessagingService.getToken(Context);
NAJSZYBSZY, ALE WYCOFANY
Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken());
Nadal działa, gdy używasz starszej biblioteki Firebase niż wersja 17.xx
źródło
FirebaseInstanceId.getInstance().getInstanceId()
zamiastFirebaseInstanceId.getInstance().getToken()
, zobacz tę odpowiedźonNewToken
zawsze zostanie wyzwolony, z dokumentacji tutaj firebase.google.com/docs/cloud-messaging/android/ ...Zespół odpowiedzialny za Firebase Android SDK nieco zmienił API. Zaimplementowałem logikę „Token to Server” w następujący sposób:
W moim wystąpieniu FirebaseMessagingService:
public class FirebaseCloudMessagingService extends FirebaseMessagingService { ... @Override public void onNewToken(String token) { // sending token to server here } ... }
Pamiętaj, że token dotyczy każdego urządzenia i Firebase może go zaktualizować niezależnie od logiki logowania. Tak więc, jeśli masz funkcje logowania i wylogowania, musisz wziąć pod uwagę dodatkowe przypadki:
Korzystając z nowego API, możesz uzyskać token w ten sposób:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String token = instanceIdResult.getToken(); // send it to server } });
Powodzenia!
źródło
Ważna informacja.
Jeśli usługa Play działa poprawnie,
FirebaseInstanceId.getInstance().getToken()
metoda zwracatoken
Log.d("FCMToken", "token "+ FirebaseInstanceId.getInstance().getToken());
źródło
Według doc
Przenieś aplikację kliencką GCM do FCM
onTokenRefresh()
Więc zadzwoni tylko za pierwszym razem, gdy zainstalujesz aplikację na swoim urządzeniu.
Dlatego sugeruję ręczne odinstalowanie aplikacji i ponowne uruchomienie
na pewno otrzymasz TOKEN
źródło
String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
onTokenRefresh
nie wywołując każdego logowania. jak mogę otrzymać token na ekranie logowania?Spróbuj tego. Dlaczego używasz
RegistrationIntentService
?public class FirebaseInstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); registerToken(token); } private void registerToken(String token) { } }
źródło
Ta linia powinna dostarczyć token Firebase FCM.
String token = FirebaseInstanceId.getInstance().getToken(); Log.d("MYTAG", "This is your Firebase token" + token);
Wykonaj Log.d, aby wydrukować go na monitorze systemu Android.
źródło
Zamiast tego:
// [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]
Zrób to:
// [START refresh_token] @Override public void onTokenRefresh() { // Get updated InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); // Log.d(TAG, "Refreshed token: " + refreshedToken); // Implement this method to send token to your app's server sendRegistrationToServer(refreshedToken); } // [END refresh_token]
I jeszcze jedno:
AKTUALIZACJA:
Nowy token Firebase jest generowany (
onTokenRefresh()
wywoływany), gdy:źródło
FirebaseInstanceId.getInstance().deleteInstanceId()
w innym wątkuJednocześnie nie zapomnij uwzględnić tego w swoim pliku manifestu, aby otrzymać identyfikator tokena
<service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service>
źródło
Metoda
getToken()
jest przestarzała. Możesz użyćgetInstanceId()
zamiast tego.Jeśli chcesz obsłużyć wyniki podczas żądania
instanceId(token)
, sprawdź ten kod.FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(instanceIdResult -> { if (instanceIdResult != null) { String token = instanceIdResult.getToken(); if (!TextUtils.isEmpty(token)) { Log.d(TAG, "retrieve token successful : " + token); } } else{ Log.w(TAG, "instanceIdResult should not be null.."); } }).addOnFailureListener(e -> { //do something with e }).addOnCanceledListener(() -> { //request has canceled }).addOnCompleteListener(task -> Log.v(TAG, "task result : " + task.getResult().getToken()));
źródło
W
firebase-messaging:17.1.0
i nowsza FirebaseInstanceIdService jest przestarzała, można dostaćonNewToken
się naFirebaseMessagingService
klasy, jak wyjaśniono na https://stackoverflow.com/a/51475096/1351469Ale jeśli chcesz po prostu zdobyć token w dowolnym momencie, teraz możesz to zrobić w ten sposób:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( this.getActivity(), new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String newToken = instanceIdResult.getToken(); Log.e("newToken",newToken); } });
źródło
Jeśli używasz jakiejś funkcji uwierzytelniania w Firebase, możesz pobrać token, używając tego:
//------GET USER TOKEN------- FirebaseUser mUser = FirebaseAuth.getInstance().getCurrentUser(); mUser.getToken(true) .addOnCompleteListener(new OnCompleteListener<GetTokenResult>() { public void onComplete(@NonNull Task<GetTokenResult> task) { if (task.isSuccessful()) { String idToken = task.getResult().getToken(); // ... } } });
Działa dobrze, jeśli użytkownik jest zalogowany. getCurrentUser ()
źródło
Spróbuj tego
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(OnSuccessListener<InstanceIdResult> { instanceIdResult -> fcm_token = instanceIdResult.token}
źródło
dla tych, którzy tu wylądują, do tej pory
FirebaseInstanceIdService
jest przestarzała, użyj zamiast tego:public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(String token) { Log.d("MY_TOKEN", "Refreshed token: " + token); // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // Instance ID token to your app server. // sendRegistrationToServer(token); } }
i zadeklaruj w AndroidManifest
<application... > <service android:name=".fcm.MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> </application>
źródło
FirebaseInstanceId.getInstance().getInstanceId().addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { if (!task.isSuccessful()) { Log.w(TAG, "getInstanceId failed", task.getException()); return; } // Get new Instance ID token String **token** = task.getResult().getToken(); } });
źródło
FirebaseInstanceId.getInstance().getInstanceId()
Jest przestarzała . Na podstawie dokumentu firebase możesz pobrać aktualny token rejestracji za pomocą następującego kodu: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(); } });
źródło
Aby uzyskać token, możesz skorzystać z następujących usług w Firebase (FCM):
FirebaseInstanceId.getInstance().getToken();
źródło
Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
źródło