Я понимаю, что это старый вопрос, но я сам сделал то же самое и натолкнулся на это, выясняя это.
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_ALARM
AudioManager.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);
Имейте в виду, что вы не можете воспроизводить звук в потоке мультимедиа, если отключите звук и вам нужно будет воспроизвести его на другом.