Як відтворювати звук сповіщення про Android


169

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

MediaPlayer mp = new MediaPlayer();
mp.reset();
mp.setDataSource(notificationsPath+ (String) apptSounds.getSelectedItem());
mp.prepare();
mp.start();

Відповіді:


421

Якщо хтось все ще шукає рішення для цього, я знайшов відповідь у розділі Як відтворювати звук мелодії / сигналу тривоги в Android

try {
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
    r.play();
} catch (Exception e) {
    e.printStackTrace();
}

Ви можете змінити TYPE_NOTIFICATION на TYPE_ALARM, але ви хочете відслідковувати свій рингтон r, щоб припинити його відтворення ... скажімо, коли користувач натискає кнопку чи щось.


2
Наприклад, телефони Motorola розширили активність налаштувань і дозволяють користувачеві визначати звук сповіщень для SMS та інших категорій. Вищеописаний метод не працюватиме з таким типом телефонів. Чи маєте ви ідею, як вирішити це питання?
Девід

2
Я отримав повідомлення про помилку з цим: MediaPlayer - Should have subtitle controller already set. Що це означає?
Декінг

Використовуючи це рішення, після 28/29 разів звуки перестають грати. Хтось знає, чому?
Том Брінккепер

1
Чому ви ловите кожен виняток? Кого можна кинути?
Miha_x64

2
@Sam, так. stackoverflow.com/q/39876885/2614353.Таким чином , не створюйте об'єкт RingTone кожного разу, коли ви його відтворюєте. Створіть його один раз, а потім відіграйте один і той же об'єкт кілька разів.
Том Брінккепер

205

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

//Define Notification Manager
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

//Define sound URI
Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext())
        .setSmallIcon(icon)
        .setContentTitle(title)
        .setContentText(message)
        .setSound(soundUri); //This sets the sound to play

//Display notification
notificationManager.notify(0, mBuilder.build());

12
Це вирішує іншу проблему - не "як відтворювати звук сповіщення", а "як відтворювати сповіщення та виводити звук". Прийнята відповідь обґрунтована у своєму рішенні.
Фабіан Тамп

7
Можливо, ви також повинні встановити це для відтворення через STREAM_NOTIFICATION, щоб воно відтворювалося з поточною перевагою гучності сповіщень ОС: .setSound (soundUri, AudioManager.STREAM_NOTIFICATION)
mwk

@Rob Riddle Це прекрасно працює. але у випадку декількох сповіщень, наприклад 100 сповіщень паралельно, звук змішується із наступним звуком сповіщення. логічно, якщо звук вже грає, він повинен дочекатися завершення попереднього відтворення. Чи можете ви допомогти в цьому сценарії?
Waqas Ali Razzaq

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

47

Якщо ви хочете відтворювати звук сповіщення за замовчуванням, ви можете використовувати метод setDefaults (int)NotificationCompat.Builder класу:

NotificationCompat.Builder mBuilder =
        new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.ic_notification)
                .setContentTitle(getString(R.string.app_name))
                .setContentText(someText)
                .setDefaults(Notification.DEFAULT_SOUND)
                .setAutoCancel(true);

Я вважаю, що це найпростіший спосіб виконати своє завдання.


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

13

Спробуйте це:

public void ringtone(){
    try {
        Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
        r.play();
     } catch (Exception e) {
         e.printStackTrace();
     }
}

9

Минув час з вашого питання, але ... Ви спробували встановити тип аудіопотоку?

mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);

Це потрібно зробити перед підготовкою.


2

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

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

Я створив набір зручних методів, за допомогою com.globalmentor.android.app.Notifications.javaяких можна створити звук сповіщень таким чином:

Notifications.notify(this);

Також світлодіод буде блимати, і якщо у вас є дозвіл на вібрацію, виникла вібрація. Так, піктограма сповіщення з’явиться на панелі сповіщень, але зникне через кілька секунд.

У цей момент ви можете усвідомити, що оскільки повідомлення в будь-якому разі відійде, ви також можете мати повідомлення прокрутки на панелі сповіщень; ви можете зробити це так:

Notifications.notify(this, 5000, "This text will go away after five seconds.");

У цьому класі є багато інших методів зручності. Ви можете завантажити всю бібліотеку з її сховища Subversion і створити її за допомогою Maven. Це залежить від глобальної або основної бібліотеки, яку також можна створити та встановити за допомогою Maven.


Це складний спосіб просто відтворити звук. Ви можете просто зробити наступне: stackoverflow.com/a/9622040/1417267
slinden77

1

Ви можете використовувати Notification і NotificationManager для відображення потрібного сповіщення. Потім ви можете налаштувати звук, який хочете відтворювати, за допомогою свого сповіщення.


5
Я не бажаю відображати сповіщення, я хочу лише відтворити звук.
ніндзясенсе

1

Я думаю, що поняття "звук сповіщення" якимось чином неправильне для Android UI.

Очікувана поведінка Android полягає у використанні стандартного сповіщення для попередження користувача. Якщо ви відтворюєте звук сповіщення без піктограми рядка стану, ви заплутуєте користувача ("що це за звук? Тут немає жодної піктограми, можливо у мене проблеми зі слухом?").

Як встановити звук для сповіщення, наприклад, тут: Налаштування звуку для сповіщення


1
Насправді це може бути повідомлення в додатку. Наприклад, якщо ви в додатку для чату і маєте невеликі звукові ефекти для вхідних та вихідних повідомлень. Це по суті повідомлення, і ви хочете, щоб вони закривалися, коли телефон знаходиться в беззвучному режимі.
copolii

Ну, ти маєш рацію, але це інша річ. Я говорив (припускаючи, що це тема питання) про "звуки системного сповіщення", тобто на системному інтерфейсі Android. Звичайно, коли ви перебуваєте у власному додатку, як все залежить від вас.
подумайте01

1
Intent intent = new Intent(this, MembersLocation.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("type",type);
    intent.putExtra("sender",sender);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    String channelId = getString(R.string.default_notification_channel_id);

    Uri Emergency_sound_uri=Uri.parse("android.resource://"+getPackageName()+"/raw/emergency_sound");
   // Uri Default_Sound_uri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    if(type.equals("emergency"))
    {
        playSound=Emergency_sound_uri;
    }
    else
    {
        playSound= Settings.System.DEFAULT_NOTIFICATION_URI;
    }

    NotificationCompat.Builder notificationBuilder =
            new NotificationCompat.Builder(this, channelId)
                    .setSmallIcon(R.drawable.ic_notification)
                    .setContentTitle(title)
                    .setContentText(body)
                    .setSound(playSound, AudioManager.STREAM_NOTIFICATION)
                    .setAutoCancel(true)
                    .setColor(getColor(R.color.dark_red))
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setContentIntent(pendingIntent);

   // notificationBuilder.setOngoing(true);//for Android notification swipe delete disabling...

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

    // Since android Oreo notification channel is needed.
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(channelId,
                "Channel human readable title",
                NotificationManager.IMPORTANCE_HIGH);
        AudioAttributes att = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
                .build();
        channel.setSound(Emergency_sound_uri, att);
        if (notificationManager != null) {
            notificationManager.createNotificationChannel(channel);
        }
    }

    if (notificationManager != null) {
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

1
Дякуємо за цей фрагмент коду, який може надати деяку обмежену та негайну допомогу. Належне пояснення буде значно поліпшити свою довгострокову цінність, показуючи , чому це є хорошим рішенням проблеми і зробить його більш корисним для читачів майбутніх з іншими подібними питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення, включаючи зроблені вами припущення.
NOhs

0

Встановити звук на канал сповіщення

        Uri alarmUri = Uri.fromFile(new File(<path>));

        AudioAttributes attributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_ALARM)
                .build();

        channel.setSound(alarmUri, attributes);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.