Я пытаюсь получать уведомления Android с помощью firebase. Я определил следующие услуги. Но сервис MyFirebaseInstanceIDService запускается при запуске приложения впервые. В то время у меня даже нет базы данных для пользователя. Я хочу сохранить токен firebase для пользователя, но сначала я хочу сделать запись для пользователя при первом действии и запустить службы при втором действии. ТАК, что я могу хранить токен пользователя.
Файл манифеста Android
<service
android:name = "in.anamika.anamika.notifications.MyFirebaseMessagingService"
android:permission = "com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name = "com.google.firebase.MESSAGING_EVENT" />
<action android:name = "com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service android:name = "in.anamika.anamika.notifications.MyFirebaseInstanceIDService">
<intent-filter>
<action android:name = "com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
вы используете базу данных firebase?
поместите этот код в свою пусковую установку / основное действие:
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("", "Refreshed token: " + refreshedToken);
это даст вам токен, чем перейдите на эту страницу ниже -
https://console.firebase.google.com/project/_/notification и create new notification->choose single device->paste - токен, который был зарегистрирован в вашем проекте студии Android-> проверьте, получили ли вы уведомление
Начиная с версии "17.0.1" SDK Cloud Messaging, FirebaseInstanceId.getInstance().getToken() устарел и заменен getInstanceId(). Он возвращает Task<InstanceIdResult>, к которому вы можете прикрепить слушателя, как показано в этом отвечать
На самом деле, приведенное выше решение не решает мою проблему. Если я получаю токен каждый раз при работе с пусковой установкой и отправляю токен в БД, это было бы неэффективно. Могу ли я добавить какой-нибудь слушатель в свою активность запуска, например onTokenRefresh ()? Я хочу, чтобы впервые я мог отправить токен в БД из определенной активности. И после этого из самого сервиса, то есть OnTokenRefresh
ЕСЛИ пользователь не вошел в систему изначально. Я не могу поместить его токен в базу данных. Итак, если пользователь не вошел в систему, я хочу подождать, пока он войдет, и после входа в систему мне нужен слушатель, например onTokenRefresh.
Исходя из того, как я понял ваш вопрос, я вижу более одного решения, а именно:
Обновленный API возвращает Задача, на котором вы можете добавить прослушиватель onSuccess и который будет вызываться, когда вы успешно получите токен.
FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(yourActivity,
new OnSuccessListener<InstanceIdResult>() {
@Override
public void onSuccess(InstanceIdResult instanceIdResult) {
String deviceToken = instanceIdResult.getToken();
// Do whatever you want with your token now
// i.e. store it on SharedPreferences or DB
// or directly send it to server
}
});
Примечание: FirebaseInstanceIdService устарел, вместо этого мы можем переопределить onNewToken (), чтобы получить новый / обновленный токен только в FirebaseMessagingService. вы можете проверить ссылку это.
ПРИМЕЧАНИЕ: Решение основано на классах FirebaseInstanceIdService и FirebaseMessagingService. Но он будет работать с более новым обновлением Firebase Android SDK.
Вот сценарий решения вашей проблемы:
В вашем обратном вызове обновления токена сначала проверьте, аутентификация присутствует. Если он присутствует, просто напишите токен на свой База данных Firebase. Также сохраните логическое значение для общих настроек в true, если токен сохранен в db, иначе установите значение false. Это решает проблема в том, что у вас нет доступа к базе данных, но вы получаете токен.
Затем создайте задачу Async в отдельном классе, которая просто вызывает
FirebaseUser для запуска
FirebaseInstanceId.getInstance().getToken(); в строю.
Затем в процессе входа в систему после успешной аутентификации firebase вызовите
выше асинхронной задачи, которая вызовет обратный вызов onTokenRefresh. Сейчас
поскольку присутствует аутентификация пользователя, ваша запись в базу данных будет успешной (также
установка общего префикса token_sent_to_db = true).
Теперь вы запускаете действие, в котором вы проверяете аутентификацию пользователя для переход к соответствующему действию добавить проверку, если общий параметр token_sent_to_db = ложь; снова вызовите асинхронную задачу. Это гарантирует, что если какие-то шаги, описанные выше, пропустят сохранение токена в db, мы сможем отправьте токен еще раз.
Наконец, токен для FCM не изменится, пока вы не заставите его изменить или если приложения не будут установлены. Таким образом, токен получит только записывается в db только один раз.
P.S: Также убедитесь, что после выхода пользователя из системы у вас истекает срок действия токена FCM, иначе ваш сервер будет продолжать отправлять уведомление вышедшему из системы пользователю. FirebaseInstanceId.getInstance (). DeleteInstanceId ();
Вы можете сохранить токен в sharedPreference до создания БД, а затем сохранить его в БД.