Android媒体应用(七)--处理音频输出的变化

来源:互联网 发布:mac ae2017百度云盘 编辑:程序博客网 时间:2024/06/05 10:01

原文地址: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 = newMediaSessionCompat.Callback() {  @Override  public void onPlay() {    registerReceiver(myNoisyAudioStreamReceiver, intentFilter);  }  @Override  public void onStop() {    unregisterReceiver(myNoisyAudioStreamReceiver);  }}

原创粉丝点击