Как остановить звуки других приложений? - PullRequest
6 голосов
/ 21 февраля 2011

У меня есть приложение, которое должно воспроизводить звук, и оно должно всегда устанавливать громкость на 100% (это звук будильника). Я использую этот кусок кода:

// First I set the volume to 100%
AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, maxVolume, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

// Now I play the sound
MediaPlayer mp = MediaPlayer.create(this, R.raw.alarm_sound);
mp.setLooping(true);
mp.prepare();
mp.start();

Это работает так, как я хочу: если «Multimedia Volume» равен 0%, он установлен на 100%, и мой звук воспроизводится. Проблема в том, что если другое приложение воспроизводит звук (например, приложение «Музыка» в фоновом режиме), эта громкость также устанавливается на 100%. Так что он воспроизводит мой звук, а другие приложения звучат вместе на все 100%.

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

1 Ответ

6 голосов
/ 22 августа 2012

Я понимаю, что это старый вопрос, но я сам сделал то же самое и натолкнулся на это, выясняя это.

Targeting API 8+ (Froyo)

Если вы 'Переориентируясь на API 8+, взгляните на http://developer.android.com/training/managing-audio/audio-focus.html, в котором обсуждается идея audio focus , и она должна позволять вам делать то, что вы хотите.Это позволяет вам быть единственным приложением, воспроизводящим аудио в потоке.

Это простая версия.

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);

// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,
                                 // Use the music stream.
                                 AudioManager.STREAM_MUSIC,
                                 // Request permanent focus.
                                 AudioManager.AUDIOFOCUS_GAIN);

if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
    // Start playback.
}

Targeting API 7+ (Eclair)

Однако, есливы похожи на меня и хотите нацелиться на API 7+, вам нужно использовать менее надежный метод, описанный ниже.

Поскольку вы подаете сигнал тревоги, лучше всего вместо этого использовать AudioManager.STREAM_ALARMAudioManager.STREAM_MUSIC и вы тоже не за горами от того, что работает.Используйте метод setStreamSolo (int streamType, логическое состояние) , чтобы отключить другие потоки, что проще, если вы используете поток сигналов тревоги.

Насколько я знаю, в этом причинадля потока тревоги связано с тем, как работает API.Вы можете отключить только весь поток (см. в конце) или все, кроме одного потока (этот пример).Вы не можете отключить звук определенных приложений или других приложений в одном потоке с помощью API 7.

AudioManager mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
// save initial volume
int mInitialVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_ALARM);

// set the alarm stream to 100%
int maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_ALARM);
mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, maxVolume, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);

// Now play the sound
MediaPlayer mp = MediaPlayer.create(this, R.raw.alarm_sound);
// change here is to set it to play on the alarm stream
mp.setAudioStreamType(AudioManager.STREAM_ALARM);
mp.setLooping(true);
mp.prepare();

// setSoloStream(...) will mute all other streams
mAudioManager.setStreamSolo(AudioManager.STREAM_ALARM, true);
mp.start();

При остановке очистите ресурсы

mp.stop();
mp.reset();
mp.release();

// release the solo steam to unmute the other streams
mAudioManager.setStreamSolo(AudioManager.STREAM_ALARM, false);

// restore the initial stream volume
mAudioManager.setStreamVolume(AudioManager.STREAM_ALARM, mInitialVolume, AudioManager.FLAG_ALLOW_RINGER_MODES);

Восстановление исходного тома приведет к потокутуда, где он был до того, как вы установили его на 100%.

Кроме того, вы можете отключить звук определенного потока с помощью setStreamMute (int, boolean) , если хотите отключить звук определенного потока.Например,

AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);

Включите звук с помощью

am.setStreamMute(AudioManager.STREAM_MUSIC, false);

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

...