Как воспроизводить рингтон / звук будильника в 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
Итак... пожалуйста, если кто-нибудь знает, как играть мелодию по умолчанию / будильник, дайте мне знать.
Я предпочитаю не загружать файлы. Просто воспроизведите мелодию по умолчанию.
13 ответов
Вы можете просто играть установленную мелодию с этим:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();
Если пользователь никогда не устанавливал будильник на своем телефоне, TYPE_ALARM может вернуть ноль. Вы можете объяснить это с помощью:
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);
}
}
Вот как я это сделал:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
mp.start();
Это похоже на способ markov00, но вместо Ringtone используется MediaPlayer, который предотвращает прерывание других звуков, таких как музыка, которые могут уже воспроизводиться в фоновом режиме.
Ваш пример в основном то, что я использую. Однако он никогда не работает на эмуляторе, потому что эмулятор по умолчанию не имеет мелодий звонка, и content://settings/system/ringtone
не разрешается ни к чему играемому. Он отлично работает на моем реальном телефоне.
Для будущих гуглов: используйте RingtoneManager.getActualDefaultRingtoneUri()
вместо RingtoneManager.getDefaultUri()
, Согласно его имени, он будет возвращать фактический URI, так что вы можете свободно использовать его. Из документации getActualDefaultRingtoneUri()
:
Получает Uri текущего звука по умолчанию. Это даст реальный звук Uri, вместо того, чтобы использовать это, большинство клиентов могут использовать DEFAULT_RINGTONE_URI.
между тем getDefaultUri()
говорит это:
Возвращает Uri для мелодии по умолчанию определенного типа. Вместо того, чтобы возвращать фактический звук Uri рингтона, он вернет символический Uri, который будет преобразован в реальный звук при воспроизведении.
Это отлично работает:
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();
Может быть, уже поздно, но для всех, кто захочет, есть новое простое решение этого вопроса.
В котлине
val player = MediaPlayer.create(this,Settings.System.DEFAULT_RINGTONE_URI)
player.start()
Приведенный выше код будет воспроизводить мелодию по умолчанию, но если вы хотите будильник по умолчанию, измените
Настройки.System.DEFAULT_RINGTONE_URI
к
Settings.System.DEFAULT_ALARM_ALERT_URI
Вы можете вставить файл MP3 в папку / SDCard с помощью DDMS, перезапустить эмулятор, затем открыть приложение "Медиа", перейти к файлу MP3, долгое нажатие на него и выбрать "Использовать в качестве мелодии звонка телефона".
Ошибка ушла!
Редактировать: та же проблема со звуками уведомлений (например, для SMS) решена с помощью приложения Ringdroid
public class AlarmReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
//this will update the UI with message
Reminder inst = Reminder.instance();
inst.setAlarmText("");
//this will sound the alarm tone
//this will sound the alarm once, if you wish to
//raise alarm in loop continuously then use MediaPlayer and setLooping(true)
Uri alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
if (alarmUri == null) {
alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
}
Ringtone ringtone = RingtoneManager.getRingtone(context, alarmUri);
ringtone.play();
//this will send a notification message
ComponentName comp = new ComponentName(context.getPackageName(),
AlarmService.class.getName());
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
Вы можете использовать этот пример кода:
Uri ringtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
Ringtone ringtoneSound = RingtoneManager.getRingtone(getApplicationContext(), ringtoneUri)
if (ringtoneSound != null) {
ringtoneSound.play();
}
Копирование аудиофайла на SD-карту эмулятора и выбор его через медиаплеер в качестве мелодии звонка по умолчанию действительно решает проблему.
Вы можете использовать приведенный ниже код;
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()
Вот пример кода:
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), notification);
mediaPlayer.start();