nac*_*aza 6 audio android volume android-audiomanager
我有一个需要播放声音的应用程序,它需要将音量设置为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();
Run Code Online (Sandbox Code Playgroud)
它的工作方式与我想的一样:如果"多媒体音量"为0%,则设置为100%并播放我的声音.问题是如果另一个应用程序正在播放声音(如背景中的音乐应用程序),该音量也会设置为100%.因此它以100%的速度播放我的声音和其他应用程序.
我希望我的应用程序停止其他应用程序的所有多媒体声音只听我的.可能吗?
我意识到这是一个古老的问题,但我自己也做了同样的事情,并在弄清楚的时候遇到了这个问题.
如果你的目标是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.
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您像我一样并希望定位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();
Run Code Online (Sandbox Code Playgroud)
停止时,清理资源
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);
Run Code Online (Sandbox Code Playgroud)
恢复初始卷将使流返回到将其设置为100%之前的位置.
此外,如果要将特定流静音,可以使用setStreamMute(int,boolean)将特定流静音.例如
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
am.setStreamMute(AudioManager.STREAM_MUSIC, true);
Run Code Online (Sandbox Code Playgroud)
取消静音
am.setStreamMute(AudioManager.STREAM_MUSIC, false);
Run Code Online (Sandbox Code Playgroud)
请记住,如果您将音频静音并且需要在另一个音频上播放,则无法在媒体流上播放音频.
归档时间: |
|
查看次数: |
4465 次 |
最近记录: |