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

本文介绍了Android音频应用程序如何正确响应用户的音量控制调整,并在耳机断开连接时避免突然的噪音干扰。文章详细解释了如何设置正确的音频流类型以及如何监听和处理ACTION_AUDIO_BECOMING_NOISY意图。
Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

原文地址: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);
  }
}

您可能感兴趣的与本文相关的镜像

Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

### 设置或修改 Android 系统媒体音频输出设备的优先级 在 Android 系统中,音频输出设备的选择遵循一定的优先级规则。当多个音频输出设备可用时,系统会选择最合适的设备进行音频播放。这种选择通常基于硬件连接状态以及应用程序的需求。 #### 后插优先机制 对于外部音频设备(如耳机、蓝牙设备),Android 实现了一种称为“后插优先”的机制。这意味着每当一个新的音频设备被插入时,它会被赋予更高的优先级,并成为默认的声音输出路径[^1]。此行为确保用户能够立即听到来自新连接设备的声音而无需额外配置。 #### 动态调整声音优先级 为了实现上述功能,在底层框架层面,特别是 `Engine.cpp` 文件中的原生逻辑负责检测并响应各种类型的外设变化事件。一旦发现新的音频设备接入,则依据预定义好的顺序重新评估现有选项,最终决定采用哪一个作为当前活动的输出端口[^2]。 #### 应用程序接口限制 值得注意的是,尽管存在多种可能的音频路由方案,但在 API 层面,开发者仅能通过有限的方式干预这一过程。例如,可以通过调用 `AudioManager.setSpeakerphoneOn()` 或者 `AudioManager.setBluetoothScoOn()` 方法来强制指定扬声器或蓝牙 SCO 连接模式下的语音通信路径。这是因为其他形式的切换操作往往由操作系统自动管理,尤其是涉及到物理连接变动的情况[^3]。 #### 修改音频输出优先级的实际方法 如果希望自定义特定场景下不同种类音频流所使用的输出装置,可以考虑利用广播接收器监听诸如 `ACTION_HEADSET_PLUG` 和 `BluetoothAdapter.ACTION_STATE_CHANGED` 等意图动作,进而根据实际情况更新应用内部的状态机或是提示用户做出相应选择。此外,还可以探索更高级别的编程接口,像 MediaSessionCompat 类所提供的控制能力,允许更加精细地调节多媒体会话期间的行为表现。 ```java // 注册广播接收器以监控耳机插入/移除事件 IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); registerReceiver(headsetPlugReceiver, filter); private final BroadcastReceiver headsetPlugReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int state = intent.getIntExtra("state", -1); // 获取耳机状态 switch (state){ case 0: Log.d(TAG,"Headphones unplugged"); break; case 1: Log.d(TAG,"Headphones plugged in"); AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE); audioManager.setMode(AudioManager.MODE_NORMAL); audioManager.startBluetoothSco(); audioManager.setBluetoothScoOn(true); break; } } }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值