Під час надсилання сповіщення з Firebase в android немає звуку сповіщення


83

Я надсилаю push-сповіщення від Firebase до моєї програми для Android. але коли моя програма перебуває у фоновому режимі, метод firebase onMessageReceived не викликається, натомість firebase надсилає повідомлення в систему для відображення сповіщення в системній області сповіщення відображається в системній області, але звуку для сповіщення немає, навіть якщо я дозволив звук сповіщення для свого додатка в налаштуваннях системи.

що я можу зробити для відтворення звуку сповіщення, коли сповіщення отримано від firebase.

Ось як я надсилаю сповіщення з Firebase на посилання мого додатка Blogpost .

Як додати Firebase у програму Android


1
Будь ласка, зверніться до цієї відповіді ..
geekoraul

не забудьте перевірити налаштування сповіщень для цього додатка
maheshmnj

@Developine: Ваше посилання зникло !! (develoine.com / ...)
Ань Нгуен,

Відповіді:


114

У корисному навантаженні сповіщення є звукова клавіша.

З офіційної документації використовується:

Позначає звук для відтворення, коли пристрій отримує сповіщення. Підтримує за замовчуванням або ім'я файлу звукового ресурсу, що входить до складу програми. Звукові файли повинні знаходитись у / res / raw /.

Наприклад:

{
    "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",

    "notification" : {
      "body" : "great match!",
      "title" : "Portugal vs. Denmark",
      "icon" : "myicon",
      "sound" : "mySound"
    }
  }

Якщо ви хочете використовувати по замовчуванням звук пристрою, ви повинні використовувати: "sound": "default".

Див. Це посилання для всіх можливих ключів у корисному навантаженні: https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

Для тих, хто не знає, Firebase обробляє сповіщення по-різному, коли програма знаходиться у фоновому режимі. У цьому випадку функція onMessageReceived не викликається.

Коли ваш додаток перебуває у фоновому режимі, Android направляє сповіщення на системний трей. Якщо користувач натисне сповіщення, за замовчуванням відкриється програма запуску програм. Сюди входять повідомлення, які містять як сповіщення, так і корисне навантаження даних. У цих випадках сповіщення доставляється в системну область пристрою, а корисне навантаження даних доставляється в додатковій частині наміру вашої активності запуску.


23
якщо ви хочете використовувати звук пристрою за замовчуванням, вам слід використовувати: "sound": "за замовчуванням"
Брайан Во

@TranVo спасибі за вказівки, що значення "за замовчуванням" відтворює звук пристрою за замовчуванням, ви заощадили мені багато часу!
Маттіа Руджеро

1
Я спробував усі можливі способи, але не міг отримати звук за замовчуванням або звук від встановлення мого власного тону, а також не отримував вібрації, що може бути причиною
santhosh

1
То як я можу відключити звук сповіщення?
iamatsundere181

1
Чи застаріла нова система Notification Channel цей API для старих пристроїв, чи все ще працює для старих пристроїв? Я намагався зробити так, щоб користувацькі звуки відображалися для пристрою Нуга, але, здається, я отримую звуковий ефект за замовчуванням, незалежно від того, що я ввожу в "звук" або "звукове ім'я". Я пробував "mysoundeffect.wav" та "mysoundeffect" без удачі.
Джон Горенфельд,

26

адаптовані варіанти виберіть розширені опції, коли напишіть повідомлення , та виберіть звук, активований виберіть активований

це Моє рішення


@KongJing в Android 8 і вище, він завжди має звук незалежно від налаштування консолі Firebase. Чи знаєте ви спосіб повністю запобігти звуку?
Подумайте двічі про код один раз

Мені шкода, що я бачу це так пізно, я не можу вирішити цю проблему. @ Подумайте двічі про кодекс
KongJing

24

Спробуйте це

{
    "to" : "DEVICE-TOKEN",

    "notification" : {
      "body"  : "NOTIFICATION BODY",
      "title" : "NOTIFICATION TITILE",
      "sound" : "default"
    }
  }

@note для спеціального звукового сповіщення: -> "sound" : "MyCustomeSound.wav"


1
То куди ви кладете цей файл? в сирому? активи?
Хамзе Собох

3
Не папка активів, створіть нову папку в розділі res, назвіть її необробленою. Потім скопіюйте та вставте файл wav або mp3 у цю папку. @HamzehSoboh
Ally Makongo

Я додаю звук у /res/raw/my_sound.mp3 в програмі для Android, а потім викликаю API зі звуком: "my_sound.mp3". Не працює, відтворювався лише звук за замовчуванням :( Хтось подібний до мене?
The Anh Nguyen

О, я змушую це спрацювати. За допомогою каналу сповіщень Android, докладніше тут: stackoverflow.com/questions/61142155/…
The Anh Nguyen

12

onMessageReceivedМетод спрацьовує лише тоді , коли додаток знаходиться на передньому плані або корисного навантаження повідомлення містить тільки тип даних.

З документів Firebase

Для обміну повідомленнями нижче за течією FCM забезпечує два типи корисного навантаження: повідомлення та дані .

Для типу сповіщення FCM автоматично відображає повідомлення на пристроях кінцевих користувачів від імені клієнтської програми. Сповіщення мають заздалегідь визначений набір видимих ​​для користувача ключів.
За тип даних клієнтська програма відповідає за обробку повідомлень даних. Повідомлення даних мають лише власні пари ключ-значення.

Використовуйте сповіщення, коли ви хочете, щоб FCM обробляв відображення сповіщень від імені вашої клієнтської програми. Використовуйте повідомлення даних, коли ви хочете, щоб ваш додаток обробляв дисплей або обробляв повідомлення у вашому клієнтському додатку Android, або якщо ви хочете надсилати повідомлення на пристрої iOS, коли є пряме з'єднання FCM.

Далі вниз по документах

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

Якщо ви використовуєте консоль firebase для надсилання сповіщень, корисне навантаження завжди міститиме тип сповіщення. Вам потрібно використовувати API Firebase, щоб надіслати сповіщення лише з типом даних у корисному навантаженні сповіщення. Таким чином ваш додаток завжди отримує сповіщення про отримання нового сповіщення, і додаток може обробляти корисне навантаження сповіщень.

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


ні, це також називається, коли додаток закрито, але ви повинні дозволити автоматичний запуск програми.
стилі фанкі

10

З HTTP v1 API все інакше

Документація

Приклад:

{
 "message":{
    "topic":"news",
    "notification":{
       "body":"Very good news",
       "title":"Good news"
    },
    "android":{
       "notification":{
          "body":"Very good news",
          "title":"Good news",
          "sound":"default"
       }
    }
  }
}

як написати це на php?
Табіш-хан

@Tabishkhan$this->message['message']['android']['notification']['sound'] = "default";
SudoPlz

7

У мене також були проблеми з повідомленнями, які повинні були видавати звук, коли програма була на передньому плані, все працювало правильно, однак, коли програма була у фоновому режимі, звук просто не виходив.

Повідомлення було надіслане сервером через FCM, тобто сервер встановив JSON сповіщення та надіслав його FCM, який потім надсилає повідомлення додаткам. Навіть якщо я ставлю звукову мітку, звук не виходить у фоновому режимі.

введіть тут опис зображення

Навіть ставлення звукової позначки це не спрацювало.

введіть тут опис зображення

Після стільких пошуків я знайшов рішення на форумі github. Потім я помітив, що в моєму випадку було дві проблеми:

1 - Не вдалося надіслати тег channel_id, важливий для роботи на рівні API 26+

введіть тут опис зображення

2 - У додатку Android, у цьому конкретному випадку, коли сповіщення надсилалися безпосередньо з сервера, мені довелося налаштувати ідентифікатор каналу заздалегідь, тому в моїй головній діяльності мені довелося налаштувати канал, щоб Android знав, що робити, коли надійшло повідомлення.

У JSON, надісланому сервером:

   {
  "title": string,
  "body": string,
  "icon": string,
  "color": string,
  "sound": mysound,

  "channel_id": videocall,
  //More stuff here ...
 }

У вашій головній діяльності:

 @Background
    void createChannel(){
            Uri sound = Uri.parse("android.resource://" + getApplicationContext().getPackageName() + "/" + R.raw.app_note_call);
            NotificationChannel mChannel;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                mChannel = new NotificationChannel("videocall", "VIDEO CALL", NotificationManager.IMPORTANCE_HIGH);
                mChannel.setLightColor(Color.GRAY);
                mChannel.enableLights(true);
                mChannel.setDescription("VIDEO CALL");
                AudioAttributes audioAttributes = new AudioAttributes.Builder()
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .setUsage(AudioAttributes.USAGE_ALARM)
                        .build();
                mChannel.setSound(sound, audioAttributes);

                NotificationManager notificationManager =
                        (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.createNotificationChannel(mChannel);
            }
    }

Це нарешті вирішило мою проблему, сподіваюся, це допоможе комусь не витрачати 2 дні, як я. Не знаю, чи потрібно це для всього, що я вкладаю в код, але це шлях. Я також не знайшов посилання на форум github для підтвердження відповіді, оскільки те, що я зробив, було тим самим, що було розміщено там.


2

робити так

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    //codes..,.,,

    Uri sound= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        builder.setSound(sound);

}

6
onMessageReceived не викликається, коли програма знаходиться у фоновому режимі. насправді це проблема, з якою я стикаюся
Developine

ти закликав це (Firebase.setAndroidContext (getApplicationContext ());) з основної діяльності
AAA

ні, я не маю. але зараз я програю відповідь на сповіщення від isl для мене працювало.
Developine

будь ласка, скажіть мені, що будівельник генерує помилку, будь ласка, визначте будівельника
Ashish Shahi

builder є повідомленняcompat builder
AAA

1

спробуйте це....

  public  void buildPushNotification(Context ctx, String content, int icon, CharSequence text, boolean silent) {
    Intent intent = new Intent(ctx, Activity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 1410, intent, PendingIntent.FLAG_ONE_SHOT);

    Bitmap bm = BitmapFactory.decodeResource(ctx.getResources(), //large drawable);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(ctx)
            .setSmallIcon(icon)
            .setLargeIcon(bm)
            .setContentTitle(content)
            .setContentText(text)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent);

    if(!silent)
       notificationBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

 NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(1410, notificationBuilder.build());
    }

а в onMessageReceived - назвіть це

 @Override
public void onMessageReceived(RemoteMessage remoteMessage) {


    Log.d("Msg", "Message received [" + remoteMessage.getNotification().getBody() + "]");

    buildPushNotification(/*your param*/);
}

або дотримуйтесь KongJing , також правильно, як він каже, але ви можете використовувати консоль Firebase.


0

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


Ваша ідея - це робота, але я вимагав ЗМІНИТИ зображення сповіщень, коли телефон заблокований. Як я можу змінити, будь ласка, допоможіть мені
Ashish Shahi

Я спробую Вам попередню ідею, але не працюю. Будь ласка, допоможіть Це так терміново
Ashish Shahi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.