Android: токен Firebase при первом запуске равен нулю

Я использую FCM для предоставления уведомлений в своем приложении. Все работало хорошо, но теперь я понял, что когда я устанавливаю свое приложение с помощью Android Studio (а не из GooglePlay), токен сначала пуст. Когда я закрываю приложение и перезапускаю его, токен больше не равен нулю. В чем причина этой проблемы и как ее избежать?

InstanceIDService:

public class InstanceIDService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String token = FirebaseInstanceId.getInstance().getToken(); registerToken(token); } private void registerToken(String token) { OkHttpClient client = new OkHttpClient(); RequestBody body = new FormBody.Builder() .add("Token",token) .build(); Request request = new Request.Builder() .url("url_to_registration_script") .post(body) .build(); try { client.newCall(request).execute(); } catch (IOException e) { e.printStackTrace(); } } } 

В MainActivity:

 FirebaseMessaging.getInstance().subscribeToTopic("topic"); String token = FirebaseInstanceId.getInstance().getToken(); Log.d("TOKEN", token); 

Последний журнал возвращает null, когда приложение установлено и запускается в первый раз

Сценарий регистрации:

  <?php if (isset($_POST["Token"])) { $_uv_Token=$_POST["Token"]; $conn = mysqli_connect("localhost","user","pass","db") or die("Error connecting"); $q="INSERT INTO users (Token) VALUES ( '$_uv_Token') " ." ON DUPLICATE KEY UPDATE Token = '$_uv_Token';"; mysqli_query($conn,$q) or die(mysqli_error($conn)); mysqli_close($conn); } ?> 

Solutions Collecting From Web of "Android: токен Firebase при первом запуске равен нулю"

Маркер извлекается асинхронно при первом запуске приложения. Вы должны дождаться, когда onTokenRefresh() будет вызван в вашем FirebaseInstanceIdService до того, как будет доступен доступ к токену.

Удалите приложение из эмулятора и запустите его снова, чтобы снова вызвать метод onTokenRefreshed.

Чтобы проверить, что вы уже зарегистрированы, и вы просто хотите узнать FCM TOken

 String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

Добавьте вышеприведенную строку в класс MyFirebaseMessagingService где-нибудь (в методе oncreate) и просто нажмите Toast или запустите файл refreshedToken.

Даже у меня была такая же проблема. Я дал инструкции Log напечатать токен в onCreate моей активности запуска. Требуется время, чтобы обновить токен после удаления приложения. Вот почему вы получаете null. Вам нужно немного подождать, чтобы обновить токен.

Я просто упал в одном и том же вопросе, и именно так я его исправил. Вызовите блок где-нибудь в onCreate() вашей активности. Я хочу отправить токен на свой сервер Parse, поэтому вы должны изменить его на основе ваших потребностей.

Это образец, за которым я последовал.

 private void subscribeUserToParse() { String deviceToken = FirebaseInstanceId.getInstance().getToken(); if (TextUtils.isEmpty(deviceToken)) { Intent intent = new Intent(this, MyFirebaseInstanceIDService.class); startService(intent); return; } User user = UserUtil.retrieveUserFromDB(mRealm); String objectId = user.getParseObjectId(); if (!TextUtils.isEmpty(objectId)) { ParseUtils.subscribeWithUsersObjectId(objectId, deviceToken); } } 

Я столкнулся с той же проблемой. Я просмотрел много сообщений SO и других форумов, и я нашел решение, которое сработало для меня. Документация FCM позволяет использовать этот метод для получения токена.

 String refreshedToken = FirebaseInstanceId.getInstance().getToken(); 

Я нашел сообщение в Интернете (я прошу прощения, я не помню, какой из них я нашел некоторое время назад), который использовал этот метод вместо этого:

 String refreshedToken = FirebaseInstanceId.getInstance().getToken() (String authorizedEntity, String scope); 

Документация FCM описывает первый метод как:

Верните главный токен для проекта Firebase по умолчанию.

В то время как вторая описывается как:

Возвращает маркер, который разрешает Entity выполнять действие от имени приложения, идентифицированного идентификатором экземпляра. Это похоже на токен OAuth2, за исключением того, что он применяется к экземпляру приложения вместо пользователя. Например, чтобы получить токен, который можно использовать для отправки сообщений в приложение через FirebaseMessaging, установите идентификатор отправителя и установите «FCM».

Я искал, почему первый вызов метода занимает больше времени, чтобы вернуть токен, но я еще не нашел ответа. Надеюсь это поможет.

Просто замените:

 String token = instanceID.getToken(); 

с:

 String token = instanceID.getToken($SENDER_ID, "FCM"); 

И это сработает.

Просто добавление этого будет работать.

 if(regid == null) { regid = FirebaseInstanceId.getInstance().getToken(); }