Как воспроизвести звук уведомления Android

169

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

MediaPlayer mp = new MediaPlayer();
mp.reset();
mp.setDataSource(notificationsPath+ (String) apptSounds.getSelectedItem());
mp.prepare();
mp.start();
ninjasense
источник

Ответы:

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, чтобы остановить его воспроизведение ... скажем, когда пользователь нажимает кнопку или что-то в этом роде.

Phidius
источник
2
Телефоны Motorola, например, расширили активность предпочтений и позволяют пользователю определять звук уведомления для смс и других категорий. Вышеуказанный метод не будет работать с телефонами этого типа. У вас есть идеи, как решить эту проблему?
Дэвид
2
Я получил сообщение об ошибке с этим: MediaPlayer - Should have subtitle controller already set. Что это означает?
Deqing
При использовании этого решения, после 28/29 раз, звуки перестают играть. Кто-нибудь знает почему?
Том Бринккемпер
1
Почему вы ловите каждое исключение? Какой из них может быть брошен?
Miha_x64
2
@ Сам, да. 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 уведомлений параллельно, звук смешивается со следующим звуком уведомления. логически, если звук уже воспроизводится, он должен ждать завершения предыдущего воспроизведения. Можете ли вы помочь в этом сценарии?
Вакас Али Раззак
не воспроизводить звук, когда приложение находится в фоновом режиме. любое предложение?
Сагар Наяк
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);

Я считаю, что это самый простой способ выполнить вашу задачу.

Aga
источник
не воспроизводит звук, когда приложение находится в фоновом режиме. любое предложение?
Сагар Наяк
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);

Это должно быть сделано перед подготовкой.

copolii
источник
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. Это зависит от библиотеки globalmentor-core, которую также можно собрать и установить с помощью Maven.

Гаррет Уилсон
источник
Сложно просто воспроизвести звук. Вы можете просто сделать это: stackoverflow.com/a/9622040/1417267
slinden77
1

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

Валентин Роше
источник
5
Я не хочу отображать уведомление, я только хочу воспроизвести звук.
ниндзясенсе
1

Я думаю, что понятие «звук уведомления» в какой-то степени неверно для пользовательского интерфейса Android.

Ожидаемое поведение Android - использовать стандартное уведомление для предупреждения пользователя. Если вы воспроизводите звук уведомления без иконки в строке состояния, вы запутываете пользователя («что это был за звук? Здесь нет иконки, может быть, у меня проблемы со слухом?»).

Как установить звук в уведомлении, например, здесь: Настройка звука для уведомления

think01
источник
1
Не совсем, это может быть уведомление в приложении. Например, если вы находитесь в приложении чата и имеете небольшие звуковые эффекты для входящих и исходящих сообщений. По сути, это уведомления, и вы хотите, чтобы они отключались, когда телефон находится в беззвучном режиме.
Copolii
Ну, вы правы, но это другое дело. Я говорил (предполагая, что это была тема вопроса) о «звуках системных уведомлений», то есть в системном графическом интерфейсе Android. Конечно, когда вы в своем собственном приложении, все зависит от вас.
think01
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());
    }
}
DSC CLG
источник
1
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную, немедленную помощь. Надлежащее объяснение будет значительно улучшить свою долгосрочную ценность, показывая , почему это является хорошим решением проблемы и сделает его более полезным для читателей будущих с другими подобными вопросами. Пожалуйста, измените свой ответ, чтобы добавить некоторые объяснения, в том числе предположения, которые вы сделали.
NOhs
0

Установить звук на канал уведомлений

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

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

        channel.setSound(alarmUri, attributes);
Милинд Чаудхари
источник