Ich bin gerade zu FCM gewandert. Ich habe meine Klasse hinzugefügt, die sich von FirebaseInstanceIdService erstreckt, um gegebenenfalls ein RefreshToken zu erhalten.
Meine Frage ist spezifisch für den Fall, dass der Nutzer meine App zum ersten Mal installiert und aus irgendeinem Grund keine Registrierungs-ID von onTokenRefresh erhalten kann. Wie sollen wir damit umgehen? Kann ich einen Broadcast-Empfänger aus meiner FirebaseInstanceIdService-Klasse einrichten, der die Main-Aktivität benachrichtigt, wenn eine Registrierungs-ID empfangen wird?
verwenden Sie die folgenden Codes:
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("FCN TOKEN GET", "Refreshed token: " + refreshedToken);
final Intent intent = new Intent("tokenReceiver");
// You can also include some extra data.
final LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
intent.putExtra("token",refreshedToken);
broadcastManager.sendBroadcast(intent);
}
in Ihrer Haupttätigkeit:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
LocalBroadcastManager.getInstance(this).registerReceiver(tokenReceiver,
new IntentFilter("tokenReceiver"));
}
BroadcastReceiver tokenReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String token = intent.getStringExtra("token");
if(token != null)
{
//send token to your server or what you want to do
}
}
};
}
Ändern Sie dies in der Datei manifest.xmltools:node="replace " Intools:node="merge".
Soweit ich weiß, ist das Token nur null, wenn Sie versuchen, Ihre App auf einem Emulator auszuführen, auf dem der Google Play-Dienst nicht vorhanden ist, und wenn Sie die doppelte E-Mail-ID für den Google Play Store (auf Ihrem tatsächlichen Gerät) verwenden, jedoch nur Eine E-Mail-ID wird für die Verwendung überprüft. In diesen Fällen erhalten Sie ein Null-Token, und ich habe FCM bereits in meinem neuen Projekt implementiert. Für den Rest aller Fälle ist das Token also nicht null.
Ich hatte das gleiche Problem. Ich habe viele SO - Posts und andere Foren durchgesehen und eine Lösung gefunden, die für mich funktionierte. In der FCM-Dokumentation heißt es, diese Methode zu verwenden, um ein Token abzurufen.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Ich habe online einen Beitrag gefunden (ich entschuldige mich, ich weiß nicht mehr, welcher. Ich habe ihn vor einiger Zeit gefunden), der stattdessen diese Methode verwendet hat:
String refreshedToken = FirebaseInstanceId.getInstance().getToken() (String authorizedEntity, String scope);
Die FCM-Dokumentation beschreibt die erste Methode als:
Geben Sie das Master-Token für das Firebase-Standardprojekt zurück.
Während der zweite als beschrieben wird:
Gibt ein Token zurück, das eine Entität dazu berechtigt, eine Aktion im Namen der Anwendung auszuführen, die durch die Instanz-ID ..__ identifiziert wird. Dies ist ähnlich einem OAuth2-Token, außer dass es sich auf die Anwendungsinstanz anstelle eines Benutzers bezieht. Um beispielsweise ein Token zu erhalten, das zum Senden von Nachrichten an eine Anwendung über FirebaseMessaging verwendet werden kann, legen Sie die Absender-ID und "FCM" fest.
Ich habe untersucht, warum der erste Methodenaufruf länger dauert, bis ein Token zurückgegeben wird, aber ich habe noch keine Antwort gefunden. Hoffe das hilft.
Verwenden Sie diese Klasse erweitert mit ..
public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
public static final String REGISTRATION_SUCCESS = "RegistrationSuccess";
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
Toast.makeText(MyFirebaseInstanceIDService.this,refreshedToken,Toast.LENGTH_LONG).show();
}
}
abhängig von Ihrer Anwendungslogik können Sie den Code schreiben, um das "neue" Token direkt in der FirebaseInstanceIdService.onTokenRefresh()
-Methode zu verarbeiten, oder Sie können LocalBroadcast verwenden, um diese Informationen an Ihre Aktivität zu senden, wenn Sie die Benutzeroberfläche ändern müssen, wenn dieses Ereignis auftritt.
Beachten Sie, dass beim Aufruf von onTokenRefresh()
Ihre Aktivität geschlossen werden könnte.
Eine mögliche Implementierung könnte eine Kombination der beiden Optionen sein:
onTokenRefresh()
hinzu, um das Token an Ihren Server zu sendenWenn Sie es auf Ihrem Emulator ausführen, überprüfen Sie, ob die Google Play-Dienste unter Extras -> Android -> SDK-Manager -> SDK-Tools -> Google Play-Dienste aktiviert sind
Starten Sie nach der Installation sowohl Android Studio als auch Ihren Emulator neu
Es hat für mich funktioniert