我意识到这是一个老问题,但我自己也做了同样的事情,并在解决这个问题时遇到了这个问题。
定位 API 8+ (Froyo)
如果您的目标是 API 8+,请查看http://developer.android.com/training/managing-audio/audio-focus.html,其中讨论了使用音频焦点的想法,并且应该允许您做您想做的事想。这使您可以请求成为唯一在流上播放音频的应用程序。
这是简单的版本。
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.
}
定位 API 7+ (Eclair)
但是,如果您像我一样并且想要针对 API 7+,则需要使用下面不太健壮的方法。
由于您正在播放警报,因此最好的选择是使用AudioManager.STREAM_ALARM
而不是,AudioManager.STREAM_MUSIC
而且您离有效的方法也不远了。使用setStreamSolo(int streamType, boolean state)方法静音其他流,如果使用报警流更容易。
据我所知,这就是警报流的原因是由于 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);
请记住,如果您将其静音,则无法在媒体流上播放音频,并且需要在另一个上播放。