Як грати звук мелодії / сигналу тривоги в Android


119

Я всюди шукав, як відтворювати звук мелодії / сигналу тривоги в 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

Так що .. будь ласка, якщо хтось знає, як відтворювати мелодію / сигнал тривоги за замовчуванням, дайте мені знати.

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

Відповіді:


186

Ви можете просто відтворити встановлену мелодію з цим:

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

Я все ще отримую помилку - Не вдалося відкрити вміст мелодії дзвону: // налаштування / система / alarm_alert
Pritesh Desai

3
Приємно і просто. Однак, залежно від пристрою, цей метод може перервати інші звуки (наприклад, музику), які можуть відтворюватися в Android.
igordc

Використання getApplicationContext () може бути не дуже вдалим варіантом. Більше інформації тут: stackoverflow.com/questions/9122627/…
Сакет,

@BartSimpson як ви вирішили проблему, я також отримав цю помилку
user3233280

1
Мелодію не можна зупинити. Якщо запустити мелодію знову, відтворюється подвійно. stopPrevious не працює, до речі, я створюю програвач мелодій дзвінка з тим же контекстним об'єктом, а не getapplicationcontext.
Метехан Токсой

65

Якщо користувач ніколи не встановлював будильник на своєму телефоні, 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);                
    }
}

1
Повернутий URI може бути nullнавіть незважаючи на правильний звук. Ви повинні перевірити значення повернення RingtoneManager.getRingtone()для nullзамість / як
Аттіла

У 2017 році не працює, коли не дзвонить. У вас це працює останнім часом на Android?

55

Це так, як я це зробив:

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

Це схоже на markov00, але він використовує MediaPlayer замість Ringtone, що запобігає перериванню інших звуків, наприклад музики, які вже можуть грати у фоновому режимі.


5
Я спробував верхню відповідь (ringtone.play), але звук може відключитися. Я використовував такий підхід, і він працював чудово.
wyz

1
Це краще рішення для тих, хто використовує будь-які інші аудіо компоненти у своєму додатку.
EntangledLoops

@YumYumYum, я щойно перевірив, і це працює. Я нічого не робив, окрім як поставив вищезазначений код у свій setOnClickListner. Що ти робив?
функція sky

17

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


11

Це добре працює:

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

2
Чому ви ділите гучність на 7,0? Це загальновідома робоча цінність чи щось ви самі викопуєте?
ErGo_404

Щось я розкопав ...: D
Камран Ахмед

Чому ви робите Float.parseFloat (Double.toString (....)) ?? Переходимо через екземпляр String, тому що ти хочеш подвійного> плаваючого перетворення? Чому ти це робиш?
Зордід

1
Ця частина є надмірною Uri.parse (RingtoneManager.getDefaultUri (RingtoneManager.TYPE_NOTIFICATION)), getDefaultUri () повертає URI вже, не потрібно розбирати його ще в іншому URI
DritanX

1
7 - максимальний обсяг для страйму
Лео Дроідкодер

11

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

Отримує Uri поточного звуку за замовчуванням. Це дасть фактичний звук Uri, замість цього використовувати більшість клієнтів можуть використовувати DEFAULT_RINGTONE_URI.

Тим часом getDefaultUri()говорить так:

Повертає Uri для мелодії виклику за замовчуванням для певного типу. Замість того, щоб повернути фактичний звук мелодії Uri, це поверне символічний Uri, який вирішиться до фактичного звуку при відтворенні.


9

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

Помилка пішла!

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


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

звідки береться AlarmService?
Едуардо Вада

2

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


2

Ви можете використовувати цей зразок коду:

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

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

0

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

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

Вищий код відтворюватиме мелодію дзвінка за замовчуванням, але якщо ви хочете, щоб будильник за замовчуванням змінився

Settings.System.DEFAULT_RINGTONE_URI

до

Settings.System.DEFAULT_ALARM_ALERT_URI


-4

Ось приклад коду:

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

Поясніть код з невеликим поясненням, відповіді лише на код не оцінені.
Султан Аллоудін

Давай, людина, ти ніколи не читаєш відповідей вище, мабуть. stackoverflow.com/a/20177743/3332634
yshahak

1
Це в основному ідентично з цією відповіддю , але mediaPlayerзамість імені змінної mp.
Макіен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.