Intereting Posts
Не удается разрешить символ AppCompatActivity. Поддержка библиотек v7 не распознается? Есть ли способ предоставить промо / купоны для людей, чтобы скачать приложение бесплатно? Как работают координаты экрана Android? Почему элементы ListView не растут, чтобы обернуть их содержимое? Android RelativeLayout выглядит сломанным Android обновляет существующее приложение Замена фрагментов и изменение ориентации Когда край прокрутки просматривается при прокрутке в android Android Google Map addMarker () очень медленный при добавлении 400 маркеров Как заблокировать ориентацию экрана для телефона, но не для планшета? (Android) Как изменяется доступ к хранилищу на Android 6? Как получить показатели экрана за пределами действия? Android Gradle не может найти символ класса Gson Установка размера диапазона в одной строке в StaggeredGridLayoutManager Android – getIdentifier всегда возвращает 0 (библиотека + приложение)

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(); }