Как воспроизводить мелодию звонка/сигнала тревоги в 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

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

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

Ответ 1

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

Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
r.play();

Ответ 2

Если пользователь никогда не устанавливал будильник на своем телефоне, 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);                
    }
}

Ответ 3

Так я сделал:

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

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

Ответ 4

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

Ответ 5

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

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();

Ответ 6

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

Ответ 9

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

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

if (ringtoneSound != null) {
    ringtoneSound.play();
}

Ответ 10

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);
    }
}

Ответ 11

Следуйте этому руководству https://www.youtube.com/watch?v=tsw7PlSauF0. Надеюсь, поможет.

Ответ 12

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

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