2

Я использую FCM в своем приложении. Я следил за документацией Firebase, и все, похоже, работают так, как ожидалось.Уведомления о Firebase Android (FCM)

Я могу получать уведомления о сообщениях, когда приложение убито, в фоновом режиме и на переднем плане.

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

  • Пользователь может отключить все уведомления в настройках приложения
  • Пользователь может изменить уведомление рингтон из настроек приложения

У меня есть идея о том, как это сделать, когда приложение находится в убит или на переднем плане. Я думаю о доступе к sharedprefs в моем FirebaseMessagingService, чтобы узнать, должно ли приложение показывать уведомление и проверять, какой рингтон следует использовать. Если существует общий способ установки этих параметров, например «отмена подписки» со всех уведомлений или изменение мелодии уведомления по умолчанию для приложения, о которой я не знаю?

Однако я не знаю, как это сделать для получения уведомлений, когда приложение находится в фоновом режиме, поскольку уведомления доставляются на системный лоток устройства. У кого-нибудь есть идея или может указать мне на документацию ... Я не нахожу информацию об этом?

+0

После: уведомление направляется в системный лоток, данные будут фактически сохранены в ваших дополнительных целях, которые вы можете захватить из активности запуска, как только уведомление будет прослушиваться с панели задач. –

+0

, чтобы вы могли показывать свое уведомление и пользовательский звук из общих настроек, даже когда приложение было убито или в фоновом режиме? – rafsanahmad007

ответ

1

По умолчанию уведомления затрагивают каждого пользователя. Если вы хотите разрешить пользователям отказаться от всех уведомлений (или определенных подмножеств уведомлений), вы должны использовать topic messaging: по умолчанию вы должны позвонить subscribeToTopic() для всех пользователей и, если они откажутся от уведомлений, d call unsubscribeToTopic().

Отправив уведомление по данной теме, его получат только подписчики.

notification payload support documentation объясняет, как включить параметр sound для переопределения мелодии звонка - на Android, который может быть любым звуком в каталоге res/raw приложения.

Следует отметить, что ни одна из этих функций поддерживаются в консоли, но требуют, чтобы создать свой собственный Firebase Cloud Messaging Server

1

Как firebase служба уведомления имеющий 2 объекта первой является «данные» и второй является «уведомление» , когда вы отправляете push из консоли firebase, он отправляет данные в объект «уведомление». Когда u обрабатывает уведомление в FirebaseMessagingService.class, вы создаете собственное уведомление с NotificationBuilder. Когда приложение находится в фоновом режиме, вы не сможете создать уведомление из объекта «уведомление». поэтому ваше пользовательское уведомление не будет отображаться в лотке уведомлений. Вам нужно нажать уведомление из вашего бэкэнд и отправить содержимое уведомлений в объект «данные». Вы сможете настраивать свое уведомление каждый раз. см это больше: https://firebase.google.com/docs/cloud-messaging/android/send-multiple

0

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

Вы можете использовать общие настройки, как вы заявили сами. Что касается общего метода, вы должны заглянуть в ответ @ianhanniballake.

Пользователь может изменить уведомление рингтон из настроек приложения

Для мелодий по умолчанию относятся к этой link. Третий ответ в этой ссылке также объясняет, как привести селектор звука из настроек активности вашего приложения. Если вы хотите, чтобы пользовательские звуки ссылались на this.

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

И еще одна вещь, поскольку вы используете услугу, поэтому вам не нужно каждый раз получать доступ к общим предпочтениям, чтобы найти, какой звук играть, вы можете сохранить выбор в любой переменной. Всякий раз, когда пользователь может изменить звук notif-звука, вы можете либо установить прослушиватель, либо {stop service -> update preferences -> restart service}. Удостоверьтесь, что каждый раз, когда начинается сервис, он считывает предпочтения.

0

В уроках this AndroidHive вы можете найти, как мы меняем Ringtone для конкретного приложения и как обрабатывать уведомления, когда приложение находится на переднем плане, а приложение находится в фоновом режиме.

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    ...... 

    // Check if message contains a notification payload. 
    if (remoteMessage.getNotification() != null) { 
     Log.e(TAG, "Notification Body: " + remoteMessage.getNotification().getBody()); 
     handleNotification(remoteMessage.getNotification().getBody()); 
    } 
} 

При отправке сообщения типа уведомления, firebase автоматически показывает уведомление, когда приложение находится в фоновом режиме. Если приложение находится на переднем плане, метод handleNotification() обрабатывает сообщение уведомления.

private void handleNotification(String message) { 
    if (!NotificationUtils.isAppIsInBackground(getApplicationContext())) { 
     // app is in foreground, broadcast the push message 
     Intent pushNotification = new Intent(Config.PUSH_NOTIFICATION); 
     pushNotification.putExtra("message", message); 
     LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification); 

     // play notification sound 
     NotificationUtils notificationUtils = new NotificationUtils(getApplicationContext()); 
     notificationUtils.playNotificationSound(); 
    }else{ 
     // If the app is in background, firebase itself handles the notification 
    } 
} 

Здесь обработки пользовательских УВЕДОМЛЕНИЕ звуко-

// Playing notification sound 
public void playNotificationSound() { 
    try { 
     Uri alarmSound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE 
       + "://" + mContext.getPackageName() + "/raw/notification"); 
     Ringtone r = RingtoneManager.getRingtone(mContext, alarmSound); 
     r.play(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
0

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

сделать firebase библиотеки для вызова onMessageReived в каждом случае

а) передний план

б) Фон

с) Убитые

вы не должны ставить JSon ключ "уведомления" в ваш запрос на firebase api, но вместо этого используйте «данные», см. ниже.

Например следующее сообщение не будет вызывать onMessagereceived()

{ 
    "to": "/topics/test", 
    "notification": { 
    "title" : "title", 
    "text": "data!", 
    "icon": "ic_notification" 
    } 
} 

, но это будет работать

{ 
    "to": "/topics/test", 
    "data": { 
     "text":"text", 
     "title":"", 
     "line1":"testline", 
     "line2":"test" 
    } 
} 

смотрите по этой ссылке: https://firebase.google.com/docs/cloud-messaging/concept-options имеет подробное описание firebase типа сообщения Например :

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 

    Log.d(TAG, "From: " + remoteMessage.getFrom()); 

    // Check if message contains a data payload. 
    if (remoteMessage.getData().size() > 0) { 
     Log.d(TAG, "Message data payload: " + remoteMessage.getData()); 
    } 

    if(remoteMessage.getData().get("state").toString().equals("Request")){ 
     sendNotification(remoteMessage.getData().get("body").toString(), remoteMessage.getData().get("message").toString(), remoteMessage.getData().get("state").toString(),Activity_name.class); 
    } 
} 

    private void sendNotification(String messageBody, String data, String state,Class<?> activityCompat) { 
     int requestID = (int) System.currentTimeMillis(); 
     Intent intent = new Intent(this, activityCompat); 
     Bundle bundle = new Bundle(); 
     bundle.putString("message", data); 
     bundle.putString("state", state); 
     intent.putExtras(bundle); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, requestID, intent, PendingIntent.FLAG_UPDATE_CURRENT); 

     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.drawable.small_logo) 
       .setContentTitle("Title") 
       .setContentText(messageBody).setContentIntent(pendingIntent) 
       .setAutoCancel(true) 
       .setStyle(new NotificationCompat.BigTextStyle() 
         .bigText(messageBody)) 
       .setTicker(messageBody); 

     NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     notificationBuilder.getNotification().flags |= Notification.FLAG_AUTO_CANCEL; 
     Notification notification = notificationBuilder.build(); 

     notificationManager.notify((int) Calendar.getInstance().getTimeInMillis(), notification); 

    } 
+0

Как я могу убедиться, что если приложение будет убито, onMessageReceived() все еще будет вызван? Есть ли какой-нибудь документ? –

Смежные вопросы