Під час надсилання сповіщення з 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.