Хобрук: Ваш путь к мастерству в программировании

Уведомление Firebase, приложение не открывается при нажатии уведомления

Я знаю, что есть куча вопросов по этой теме, но моя проблема немного отличается.

Я использую облачный обмен сообщениями Firebase, чтобы уведомлять клиентов об определенных действиях. Когда приложение убито или находится в фоновом режиме, и насколько я нахожусь в отладке, я вижу, что когда уведомление получено устройством, метод onMessageReceived не запускается, у меня есть класс FCMNotificationIntentService extends FirebaseMessagingService {...}, в котором находится метод onMessageReceived, и просто конструктор по умолчанию, например:

  public class FCMNotificationIntentService extends FirebaseMessagingService { 
   
   public FCMNotificationIntentService() {
        super(); 
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        sendNotification(remoteMessage);
    }
        //other methods and stuff...
}

поэтому, когда устройство получает уведомление, оно не запускает onMessageReceived, а только конструктор, что означает, что уведомление приходит на устройство без данных. Почему это происходит, когда приложение находится на переднем плане, onMessageReceived всегда запускается, и с сервера поступают данные.

Любое предложение или идея высоко ценится.


Ответы:


1

Вы переопределили onNewToken и отправляете ли вы токен на свой сервер, чтобы разрешить связь с устройством? В свой класс обслуживания добавьте:

@Override
public void onNewToken(String s) {
    super.onNewToken(s);
}

Вы можете обратиться к этому https://github.com/firebase/quickstart-android/issues/548

30.08.2018
  • @TaulantLoshi, и вы уверены, что ваш хост получает этот токен и правильно им управляет при отправке push? В студии, если вы перейдете к инструментам -> firebase -> облачный обмен сообщениями -> настроить облачный обмен сообщениями, будет ли указано, что вы подключены к Firebase и что FCM правильно настроен в ваших зависимостях? 30.08.2018
  • да, я сделал даже это, я пробовал несколько разных способов, но все еще не могу запустить метод onMessageReceived. 30.08.2018

  • 2

    Попробуйте это его рабочий код

    public class MyFirebaseMessagingService extends FirebaseMessagingService {
    
    private static final String TAG = "MyFirebaseMsgService";
    
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        //Displaying data in log
        //It is optional
        Log.d(TAG, "From: " + remoteMessage.getFrom());
        Log.d(TAG, "Notification Message Data: " + remoteMessage.getData());
        //        Log.d(TAG, "Notification Message Body: " + 
        remoteMessage.getNotification().getBody());
        String message_title = "";
        String from_user_id = "";
        String to_user_id = "";
        String type = "";
        String sound = "";
        String vibrate = "";
        String message = "";
    
        try {
            message_title = remoteMessage.getData().get("message_title");
            from_user_id = remoteMessage.getData().get("from_user_id");
            to_user_id = remoteMessage.getData().get("to_user_id");
            type = remoteMessage.getData().get("type");
            sound = remoteMessage.getData().get("sound");
            vibrate = remoteMessage.getData().get("vibrate");
            message = remoteMessage.getData().get("message");
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    
    
    
        //Calling method to generate notification
    
      sendNotification(message_title,from_user_id,to_user_id,type,sound,vibrate,message);
      }
                boolean whiteIcon = (Build.VERSION.SDK_INT >= 
      Build.VERSION_CODES.LOLLIPOP);
    
    
    //This method is only generating push notification
    //It is same as we did in earlier posts
    private void sendNotification(String message_title, String from_user_id,String 
    to_user_id, String type, String sound,String vibration,String message) {
     //       Intent intent = new Intent(this, MainActivity.class);
    
     //        if (AppData.getInstance().getReader(this)==null){
           Intent intent = new Intent(this, ChatListActivity.class);
     //        }else {
     //            intent = new Intent(this, ArticlesActivity.class);
     //            
      intent.putExtra(Const.getInstance().iFrom,Const.getInstance().notification);
     //            intent.putExtra("notification",1);
     //        }
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);
    
        Uri defaultSoundUri= 
        RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new 
        NotificationCompat.Builder(this)
               // .setSmallIcon(R.mipmap.ic_launcher)
                .setSmallIcon(getNotificationIcon())
                .setContentTitle(message_title)
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setDefaults(Notification.DEFAULT_ALL)
                .setPriority(Notification.PRIORITY_HIGH)
                .setContentIntent(pendingIntent)
                    .setColor(whiteIcon ? getResources().getColor(R.color.colorPrimary) : 
        getResources().getColor(android.R.color.transparent));
    
        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
        notificationManager.notify(0, notificationBuilder.build());
        }
        private int getNotificationIcon() {
        boolean whiteIcon = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP);
        return whiteIcon ? R.drawable.notification: R.mipmap.ic_launcher;
        }
      // 
       //    }
      }
    
    31.08.2018
    Новые материалы

    Решения DBA Metrix
    DBA Metrix Solutions предоставляет удаленного администратора базы данных (DBA), который несет ответственность за внедрение, обслуживание, настройку, восстановление базы данных, а также другие..

    Начало работы с Блум
    Обзор и Codelab для генерации текста с помощью Bloom Оглавление Что такое Блум? Некоторые предостережения Настройка среды Скачивание предварительно обученного токенизатора и модели..

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

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