Я впервые использую FCM.
Я загружаю образец из firebase / quickstart-android и устанавливаю FCM Quickstart. Но я не могу получить токен из журнала, даже нажав кнопку LOG TOKEN в приложении.
Затем я пытаюсь отправить сообщение с помощью консоли Firebase и настраиваю таргетинг на имя моего пакета приложения. Я получаю входящие сообщения.
Я хочу знать, можно ли использовать FCM? GCM все в порядке.
Решение:
Потому что я не разработчик Android, а просто backend-разработчик. Так что мне нужно время, чтобы решить эту проблему. На мой взгляд, в тестовом приложении есть несколько ошибок.
Код:
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.
}
}
Добавьте это в MainActivity.java.
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
После выполнения вышеуказанного вы получите токен в Logcat. Но, наконец, я нашел удобный способ получить это. Просто используйте режим отладки, чтобы установить образец приложения, и вы сможете получить токен при его первой установке.
Но я не знаю, почему он не может распечатать журнал, когда я его устанавливаю. Может быть связано с мобильной системой.
И тогда почему я не могу получить уведомление. FirebaseMessagingService.onMessageReceived не вызывает sendNotification
String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
Ответы:
САМЫЙ БЫСТРЫЙ И ХОРОШИЙ ДЛЯ ПРОТОТИПА
Быстрое решение - сохранить его в sharedPrefs и добавить эту логику в
onCreate
метод в вашем MainActivity или классе, расширяющем 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 :("));
ЧИСТЫЙ ПУТЬ
Лучше создать сервис и придерживаться аналогичной логики. Сначала создайте новую службу
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"); } }
А затем добавьте его в файл AndroidManifest
<service android:name=".MyFirebaseMessagingService" android:stopWithTask="false"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
Наконец, вы можете использовать статический метод из своей службы
MyFirebaseMessagingService.getToken(Context);
САМЫЕ БЫСТРЫЕ, НО УСТАРЕВШИЕ
Log.d("Firebase", "token "+ FirebaseInstanceId.getInstance().getToken());
Он все еще работает, когда вы используете более старую библиотеку firebase, чем версия 17.xx
источник
FirebaseInstanceId.getInstance().getInstanceId()
вместоFirebaseInstanceId.getInstance().getToken()
, см. Этот ответonNewToken
всегда будет запускаться, из документации здесь firebase.google.com/docs/cloud-messaging/android/…Команда Firebase Android SDK немного изменила API. Я реализовал логику «Token to Server» следующим образом:
В моем экземпляре FirebaseMessagingService:
public class FirebaseCloudMessagingService extends FirebaseMessagingService { ... @Override public void onNewToken(String token) { // sending token to server here } ... }
Имейте в виду, что токен предназначен для каждого устройства и может быть обновлен Firebase независимо от вашей логики входа. Итак, если у вас есть функции входа и выхода, вы должны рассмотреть дополнительные случаи:
Используя новый API, вы можете получить такой токен:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String token = instanceIdResult.getToken(); // send it to server } });
Удачи!
источник
Важная информация.
Если служба воспроизведения работает правильно,
FirebaseInstanceId.getInstance().getToken()
метод возвращаетtoken
Log.d("FCMToken", "token "+ FirebaseInstanceId.getInstance().getToken());
источник
Согласно док.
Перенос клиентского приложения GCM на FCM
onTokenRefresh()
Поэтому он будет вызывать только в первый раз, когда вы устанавливаете приложение на свое устройство.
Поэтому я предлагаю удалить приложение вручную и попробовать запустить снова.
обязательно получите ТОКЕН
источник
String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken);
onTokenRefresh
не вызывая каждый логин. как я могу получить токен на моем экране входа в систему?Попробуй это. Почему вы используете
RegistrationIntentService
?public class FirebaseInstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); registerToken(token); } private void registerToken(String token) { } }
источник
Эта строка должна предоставить вам токен firebase FCM.
String token = FirebaseInstanceId.getInstance().getToken(); Log.d("MYTAG", "This is your Firebase token" + token);
Сделайте Log.d, чтобы распечатать его на мониторе Android.
источник
Вместо этого:
// [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]
Сделай это:
// [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]
И еще кое-что:
ОБНОВИТЬ:
Новый токен Firebase генерируется (
onTokenRefresh()
вызывается), когда:источник
FirebaseInstanceId.getInstance().deleteInstanceId()
другую темуВ то же время не забудьте включить это в свой файл манифеста, чтобы получить идентификатор токена.
<service android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service>
источник
Метод
getToken()
устарел. Ты можешь использоватьgetInstanceId()
Вместо этого .Если вы хотите обрабатывать результаты при запросе
instanceId(token)
, проверьте этот код.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()));
источник
В
firebase-messaging:17.1.0
и новее FirebaseInstanceIdService устарела, вы можете получитьonNewToken
наFirebaseMessagingService
классе , как описано на https://stackoverflow.com/a/51475096/1351469Но если вы хотите просто получить токен в любое время, то теперь вы можете сделать это так:
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener( this.getActivity(), new OnSuccessListener<InstanceIdResult>() { @Override public void onSuccess(InstanceIdResult instanceIdResult) { String newToken = instanceIdResult.getToken(); Log.e("newToken",newToken); } });
источник
Если вы используете какую-то функцию аутентификации firebase, вы можете взять токен, используя это:
//------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(); // ... } } });
Хорошо работает, если пользователь вошел в систему. getCurrentUser ()
источник
попробуй это
FirebaseInstanceId.getInstance().instanceId.addOnSuccessListener(OnSuccessListener<InstanceIdResult> { instanceIdResult -> fcm_token = instanceIdResult.token}
источник
для тех, кто приземляется здесь, сейчас
FirebaseInstanceIdService
не рекомендуется использовать вместо этого: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); } }
и объявить в AndroidManifest
<application... > <service android:name=".fcm.MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service> </application>
источник
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(); } });
источник
FirebaseInstanceId.getInstance().getInstanceId()
Является устаревшим . На основе документа firebase вы можете получить текущий регистрационный токен, используя следующий код: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(); } });
источник
Вы можете использовать следующее в Firebase (FCM), чтобы получить токен:
FirebaseInstanceId.getInstance().getToken();
источник
Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);
источник