Как получить доступ к звуковому сигналу Android по умолчанию?

Я хотел бы, чтобы кнопка издавала звуковой сигнал, чтобы указать, что она была нажата. Я хочу знать, как использовать звук звукового сигнала Android по умолчанию (например, при настройке громкости звонка) вместо импорта моего собственного музыкального файла mp3 или использования ToneGenerator?


person user812892    schedule 24.06.2011    source источник


Ответы (4)


public void playSound(Context context) throws IllegalArgumentException, 
                                              SecurityException, 
                                              IllegalStateException,
                                              IOException {

    Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    MediaPlayer mMediaPlayer = new MediaPlayer();
    mMediaPlayer.setDataSource(context, soundUri);
    final AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

    if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) {
        mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
        // Uncomment the following line if you aim to play it repeatedly
        // mMediaPlayer.setLooping(true);
        mMediaPlayer.prepare();
        mMediaPlayer.start();
    }
}

Я нашел другой ответ:

try {
    Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Ringtone r = RingtoneManager.getRingtone(getApplicationContext(), notification);
    r.play();
} catch (Exception e) {
    e.printStackTrace();
}

кредит идет на https://stackoverflow.com/a/9622040/737925

person Mohammad Ersan    schedule 14.07.2011
comment
Я использовал этот код, и меня раздражало, что звук повторяется. Теперь я вижу проблему: mMediaPlayer.setLooping(true); Почему вы хотите, чтобы этот звук зацикливался?? - person Simon Forsberg; 25.04.2012
comment
@SimonAndréForsberg зависит от желания разработчика - person Mohammad Ersan; 27.04.2012
comment
Имеет ли значение то, что mMediaPlayer выходит за пределы области действия и доступен для сборки мусора до того, как звук завершит воспроизведение, или звук уже передан компонентам более низкого уровня, которые обеспечат завершение воспроизведения вызовом mMediaPlayer.start()? - person ahcox; 02.05.2012
comment
Обратите внимание, что этот код проверяет уровень звука и воспроизводит поток будильника. В случае с плакатом вам нужно поменять местами AudioManager.STREAM_AlARM экземпляров на AudioManager.STREAM_NOTIFICATION. См. AudioManager документы для других вариантов, но здесь уведомление кажется правильным выбором. - person ahcox; 02.05.2012
comment
Для меня RingtoneManager.TYPE_NOTIFICATION воспроизводит длинный полифонический сигнал о прибытии нового текстового сообщения. Я не вижу варианта, который заставит OP изменить стандартную громкость звукового сигнала. - person ahcox; 02.05.2012

... использовать звуковой сигнал Android по умолчанию (например, при настройке громкости звонка) ...

На моем Cyanogen 7 Nexus One и моем старом стоковом T-Mobile Pulse Mini (последний по памяти), насколько я могу слышать, это точно звуковой сигнал по умолчанию при изменении громкости:

     final ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_NOTIFICATION, 100);
     tg.startTone(ToneGenerator.TONE_PROP_BEEP);

Кажется, вы просите альтернативу ToneGenerator, но я думаю, что это дает вам именно то, что вы хотите, в двух строках.

Вот некоторые другие вероятные звуки ToneGenerator, которые я пробовал, но они не совпадают (первые два могут быть полезны в качестве альтернативы звуковому сигналу громкости):

     // Double beeps:     tg.startTone(ToneGenerator.TONE_PROP_ACK);
     // Double beeps:     tg.startTone(ToneGenerator.TONE_PROP_BEEP2);
     // Sounds all wrong: tg.startTone(ToneGenerator.TONE_CDMA_KEYPAD_VOLUME_KEY_LITE);
person ahcox    schedule 02.05.2012
comment
Лучше всего использовать непрерывный тон, например, от ToneGenerator.TONE_DTMF_0 до ToneGenerator.TONE_DTMF_S, иначе звуковой сигнал прервется и начнется снова в зависимости от выбранного описания тона. Это произойдет, если ваша durationMs (переданная как параметр в startTone (int toneType, int durationMs) больше, чем общая продолжительность тона. - person ungalcrys; 10.02.2015
comment
Привет @ungalcrys, я не в состоянии легко перепроверить это в данный момент, но спрашивающий попросил звук звукового сигнала Android по умолчанию (например, когда вы регулируете громкость звонка). Когда я тестировал, это было именно то, что я дал выше: ToneGenerator.TONE_PROP_BEEP. - person ahcox; 10.02.2015
comment
У кого-нибудь были проблемы с S6 Edge? ToneGenerator отлично работает в S6, но S6 Edge мне ничего не дает. - person GR Envoy; 12.06.2015
comment
@GREnvoy Привет, это интересно. Я думаю, что это должен быть отдельный вопрос. Или, что еще лучше, запрос в службу поддержки Samsung. - person ahcox; 12.06.2015

Вы можете получить доступ к звуковому сигналу Android по умолчанию через класс ToneGenerator.

import android.media.AudioManager;
import android.media.ToneGenerator;
ToneGenerator toneGenerator = new ToneGenerator(AudioManager.STREAM_MUSIC, 200);
toneGenerator.startTone(ToneGenerator.TONE_CDMA_EMERGENCY_RINGBACK);

Дополнительная информация о том, как они звучат: https://developer.android.com/reference/android/media/ToneGenerator и https://www.youtube.com/watch?v=HVu7K9W1_BM

person Yigit Alparslan    schedule 02.07.2020
comment
Блестяще, спасибо. На мгновение я подумал, что мне придется написать 3498734 строки кода, чтобы приложение издавало звуковой сигнал. - person pookie; 28.07.2020

простой способ - использовать экземпляр класса ToneGenerator:

    //declaration
    ToneGenerator toneG;
    //using any where`
    if(val>=taux_max)
    {
        taux_text.setTextColor(warnning_col);
        toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); //200 is duration in ms
    }
person amine.b    schedule 22.02.2013