Как воспроизвести рингтон / звук будильника на Android

Я везде искал, как воспроизвести мелодию звонка / звук будильника в Android.

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

Я не могу заставить это работать:

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(this, alert);
final AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
    player.setAudioStreamType(AudioManager.STREAM_ALARM);
    player.setLooping(true);
    player.prepare();
    player.start();
}

Я получаю такую ​​ошибку:

04-11 17:15:27.638: ERROR/MediaPlayerService(30): Couldn't open fd for
content://settings/system/ringtone

Итак ... пожалуйста, если кто-нибудь знает, как включить мелодию звонка / будильник по умолчанию, дайте мне знать.

Я предпочитаю не загружать файлы. Просто включите мелодию звонка по умолчанию.


person Federico    schedule 11.04.2010    source источник


Ответы (13)


Вы можете просто воспроизвести установленный рингтон с помощью этого:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
person markov00    schedule 19.12.2011
comment
Я по-прежнему получаю сообщение об ошибке - Не удалось открыть содержимое рингтона: // settings / system / alarm_alert - person Bilbo Baggins; 10.02.2013
comment
Красиво и просто. Однако, в зависимости от устройства, этот метод может прерывать другие звуки (например, музыку), которые могут воспроизводиться в Android. - person igordc; 24.11.2013
comment
Использование getApplicationContext () может быть не очень хорошим вариантом. Подробнее здесь: stackoverflow.com/questions/9122627/ - person Saket; 12.06.2014
comment
@BartSimpson, как вы решили проблему, я тоже получаю эту ошибку - person user3233280; 26.10.2014
comment
Я пробовал это, но звук может отключаться. Я использовал MediaPlayer, поскольку igordcard @ ответил, что он работает отлично. - person wyz; 11.03.2015
comment
Рингтон не направляется на bluetooth-гарнитуру :( - person Anuj Jain; 31.08.2015
comment
Рингтон невозможно остановить. Если снова запустить рингтон, воспроизводится дважды. stopPrevious не работает, кстати, я создаю проигрыватель рингтонов с тем же объектом контекста, а не с getapplicationcontext. - person Metehan Toksoy; 24.12.2015
comment
можно изменить контекст или получить системную услугу для мелодии звонка - person blackHawk; 09.06.2017
comment
@MetehanToksoy, вы должны отслеживать экземпляр Ringtone, например, как переменную класса. Потом вы можете сделать что-нибудь вроде myRingtone.stop(). - person wildcat12; 24.06.2017

Если пользователь никогда не устанавливал будильник на своем телефоне, TYPE_ALARM может вернуть значение null. Вы можете учесть это с помощью:

Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);

if(alert == null){
    // alert is null, using backup
    alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    // I can't see this ever being null (as always have a default notification)
    // but just incase
    if(alert == null) {  
        // alert backup is null, using 2nd backup
        alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);                
    }
}
person Blundell    schedule 16.04.2011
comment
Возвращенный URI может быть не null, даже если он не указывает на допустимый звук. Вы должны проверить возвращаемое значение RingtoneManager.getRingtone() для null вместо / также - person Attila; 04.01.2013
comment
В 2017 году не работал перезвонить. У вас он работает в последних версиях Android? - person ; 28.06.2017

Вот как я поступил:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
mp.start();

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

person igordc    schedule 24.11.2013
comment
Я попробовал ответить на самый верхний вариант (ringtone.play), но звук может пропадать. Я использовал этот подход, и он отлично сработал. - person wyz; 11.03.2015
comment
Это лучшее решение для всех, кто использует любые другие аудиокомпоненты в своем приложении. - person EntangledLoops; 12.08.2015
comment
@YumYumYum, я только что протестировал и работает. Я ничего не сделал, только поместил приведенный выше код в свой setOnClickListner. Что ты сделал? - person feature sky; 30.06.2017

Ваш пример - это в основном то, что я использую. Однако он никогда не работает в эмуляторе, потому что по умолчанию в эмуляторе нет рингтонов, и content://settings/system/ringtone не разрешает ничего воспроизводимого. Он отлично работает на моем настоящем телефоне.

person synic    schedule 11.04.2010

Для будущих гуглеров: используйте RingtoneManager.getActualDefaultRingtoneUri() вместо RingtoneManager.getDefaultUri(). Судя по названию, он вернет фактический uri, так что вы можете свободно использовать его. Из документации getActualDefaultRingtoneUri():

Получает Uri текущего звука по умолчанию. Это даст фактический звуковой Uri, вместо этого большинство клиентов могут использовать DEFAULT_RINGTONE_URI.

Между тем getDefaultUri() говорит следующее:

Возвращает Uri для мелодии звонка по умолчанию определенного типа. Вместо того, чтобы возвращать фактический Uri звука рингтона, будет возвращен символический Uri, который будет преобразован в фактический звук при воспроизведении.

person Matvey Rybakov    schedule 31.03.2017

Это отлично работает:

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
MediaPlayer thePlayer = MediaPlayer.create(getApplicationContext(), RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));

try {
    thePlayer.setVolume((float) (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) / 7.0)),
                        (float) (audioManager.getStreamVolume(AudioManager.STREAM_NOTIFICATION) / 7.0)));
} catch (Exception e) {
    e.printStackTrace();
}

thePlayer.start();
person Kamran Ahmed    schedule 13.09.2013
comment
Почему ты делишь громкость на 7.0? Это общеизвестная рабочая ценность или что-то, что вы откопали сами? - person ErGo_404; 22.10.2013
comment
Что-то откопал ...: D - person Kamran Ahmed; 23.10.2013
comment
Почему вы делаете Float.parseFloat (Double.toString (....)) ?? Вы просматриваете экземпляр String, потому что хотите преобразование с двойным ›числом с плавающей запятой? Почему ты делаешь это? - person Zordid; 10.06.2015
comment
Эта часть является избыточным Uri.parse (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () уже возвращает URI, нет необходимости анализировать его в другой URI - person DritanX; 17.11.2015
comment
7 - это максимальный объем для трамплина. - person Leo Droidcoder; 21.05.2018

Вы можете вставить файл MP3 в папку / sdcard с помощью DDMS, перезапустить эмулятор, затем открыть приложение «Медиа», перейти к файлу MP3, нажать и удерживать его и выбрать «Использовать в качестве мелодии звонка для телефона».

Ошибка исчезла!

Изменить: такая же проблема со звуками уведомлений (например, для SMS) решена с помощью приложения Ringdroid

person OcuS    schedule 15.09.2010

Возможно, уже поздно, но для всех, кто захочет, есть новое простое решение этого вопроса.
In kotlin

val player = MediaPlayer.create(this,Settings.System.DEFAULT_RINGTONE_URI)
player.start()

Приведенный выше код будет воспроизводить мелодию по умолчанию, но если вы хотите будильник по умолчанию, измените

Настройки.System.DEFAULT_RINGTONE_URI

to

Settings.System.DEFAULT_ALARM_ALERT_URI

person Reza    schedule 02.08.2020
comment
ты спасешь мой день! - person hamid; 20.12.2020

Копирование аудиофайла на SD-карту эмулятора и выбор его через медиаплеер в качестве мелодии звонка по умолчанию действительно решает проблему.

person Valentin Klinghammer    schedule 05.10.2010

Вы можете использовать этот пример кода:

Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
Ringtone ringtoneSound = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri)

if (ringtoneSound != null) {
    ringtoneSound.play();
}
person Gio MV    schedule 31.03.2015

Вы можете использовать приведенный ниже код;

val ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)
// for alarm
// val ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)
val ringtoneSound: Ringtone = RingtoneManager.getRingtone(requireContext(), ringtoneUri)
    ringtoneSound.play()

для остановки;

ringtoneSound.stop()
person Ahmet    schedule 09.06.2021

Вот пример кода:

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), notification);
mediaPlayer.start();
person Nishant    schedule 16.07.2014
comment
Поясните код с небольшими пояснениями. Ответы только на код не приветствуются. - person Sulthan Allaudeen; 16.07.2014
comment
Давай, чувак, ты, наверное, никогда не читал ответы выше. stackoverflow.com/a/20177743/3332634 - person yshahak; 05.07.2015
comment
Это в основном идентично этому ответу, но с именем переменной mediaPlayer вместо mp. - person Makyen♦; 30.06.2018

person    schedule
comment
откуда AlarmService? - person Eduardo Wada; 26.04.2020