原文地址:https://developer.android.google.cn/guide/topics/media-apps/volume-and-earphones.html
除了响应您的用户界面控件和媒体按钮,音频应用程序还应该对可能影响其声音的其他Android事件做出反应。
本页介绍如何处理这些情况:
- 用户调整硬件音量控制时更改音量
- 如果耳机在使用中断开,请停止播放
尊重音量控制
当用户在游戏或音乐应用程序中按下音量键时,音量应该改变,即使播放器在歌曲之间暂停或当前游戏位置没有音乐。Android使用单独的音频流播放音乐,闹钟,通知,来电铃声,系统声音,通话音量和DTMF铃声。这允许用户独立地控制每个流的音量。
默认情况下,按音量控制可以修改活动音频流的音量。如果您的应用程序当前没有播放任何内容,请按音量键调整铃声音量。
除非您的应用程序是更换闹钟,否则您可能使用STREAM_MUSIC流播放音频。
为了确保音量控制调整正确的流,你应该调用setTransactionStream()传入AudioManager.STREAM_MUSIC。
setVolumeControlStream(AudioManager.STREAM_MUSIC);
在应用程序的生命周期中尽早调用此调用,通常来自控制媒体的活动或片段的onCreate()方法。只要目标活动或片段可见,就会将音量控件连接到STREAM_MUSIC。
不要吵闹
当用户从Android设备上欣赏音频时,用户有很多选择。大多数设备都具有内置扬声器,用于有线耳机的耳机插孔,还有许多设备具有蓝牙连接并支持A2DP音频。拔下耳机或断开蓝牙设备时,音频流会自动重新路由至内置扬声器。如果你听大音量的音乐,这可能是一个嘈杂的惊喜。
幸运的是,当这种情况发生时,系统广播一个ACTION_AUDIO_BECOMING_NOISY意图。无论何时播放音频,都应该创建一个BroadcastReceiver来监听这个意图。在音乐播放器的情况下,用户通常期望播放暂停。对于游戏应用程序,您可以选择显着降低音量。你的接收器应该是这样的:
private class BecomingNoisyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
// Pause the playback
}
}
}
开始播放时注册接收器,停止时取消注册。 如果您按照本指南中的描述设计应用程序,则这些调用应显示在onPlay()和onStop()媒体会话回调中。
private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
private BecomingNoisyReceiver myNoisyAudioStreamReceiver = new BecomingNoisyReceiver();
MediaSessionCompat.Callback callback = new
MediaSessionCompat.Callback() {
@Override
public void onPlay() {
registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
}
@Override
public void onStop() {
unregisterReceiver(myNoisyAudioStreamReceiver);
}
}