【Audio&Video】处理音频输出的变化(13)

用户希望能够控制音频应用程序的音量。标准行为包括使用音量控制(设备上的按钮或旋钮或用户界面中的滑块),并避免在使用时如耳机等外围设备断开连接时突然播放。

使用音量控制


当用户在游戏或音乐应用程序中按音量键时,音量应该改变,即使播放器在歌曲之间暂停或当前游戏位置没有音乐。

Android使用单独的音频流播放音乐,闹钟,通知,来电铃声,系统声音,通话音量和DTMF铃声。这允许用户独立控制每个流的音量。

默认情况下,按音量控制会修改活动音频流的音量。如果您的应用程序当前没有播放任何内容,请按音量键调整铃声音量。

除非你的应用程序是闹钟,否则你应该使用STREAM_MUSIC 流播放音频 。

为确保音量控制器调整正确的流,您应该调用 setVolumeControlStream()传入 AudioManager.STREAM_MUSIC。

setVolumeControlStream(AudioManager.STREAM_MUSIC);

在应用程序的生命周期中进行此调用,通常来自onResume() 控制媒体的活动或片段的方法。STREAM_MUSIC只要目标活动或片段可见,就将这些音量控件连接起来。

以编程方式控制流量

在极少数情况下,您可以通过编程方式设置音频流的音量。例如,当您的应用替换现有的用户界面时。不推荐这样做,因为Android AudioManager将所有相同类型的音频流混合在一起。这些方法会更改使用该流的每个应用程序的音量。避免使用它们:

adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()

使用固定音量设备


某些设备(如Chromebook)具有音量控制,但不允许应用使用上述AudioManager方法更改音频流的级别。这些被称为固定音量设备。您可以通过调用发现您的应用是否在固定设备上运行isVolumeFixed()。

当您的应用在固定音量设备上运行时,提供应用内音量控制是最佳做法。这提供了将应用程序的音量与其他可能在同一个流上播放的应用程序的音量进行平衡的能力。

您可以通过设置播放器或音轨的音量来控制应用程序对输出流的音频贡献。下表显示了适当的方法:

【Audio&Video】处理音频输出的变化(13)

不要吵闹


当用户从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);
  }
}

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Audio&Video】处理音频输出的变化(13)

猜你喜欢

转载自blog.51cto.com/4789781/2130465