解决在Android设备播放音频与其他应用重音的问题,并监听耳机的控制按钮

本文详细介绍了在Android开发中如何处理音频焦点,避免播放音频时与其他应用产生冲突,以及如何监听耳机物理按键控制音频播放。内容涵盖请求和管理音频焦点、处理焦点丢失、音频输出硬件变化以及通过BroadcastReceiver响应媒体按钮事件。
摘要由CSDN通过智能技术生成

概述

在安卓开发中免不了需要播放一点音乐了,音频了。但是这时候有别的应用正在播放,这时候就会出现重音的现象,完全影响用户体验,我们的项目就遇上了这样的尴尬,然后查找了一些文档,记录一下;

管理音频焦点

从谷歌开发了解到,这跟音频的焦点又关系,我们可以获取当前音频的焦点来解决问题;
有多个应用程序可能播放音频,重要的是要考虑他们应该如何交互。为了避免每个音乐应用程序同时播放,Android使用音频焦点来控制音频播放 - 只有拥有音频焦点的应用程序才能播放音频。
在您的应用程序开始播放音频之前,应该请求并接收音频焦点。同样,它应该知道如何监听音频焦点的丢失,并在发生这种情况时适当地做出反应。

请求音频焦点

在应用开始播放任何音频之前,自己的应用应该保留将使用的流的音频焦点,简单说就是我要现在的焦点,其他人靠边,但是别人同样也可能有这样的操作,我们也需要监听自己播放的焦点的变化,增加自己程序的兼容性。这是通过调用requestAudioFocus()完成的,如果您的请求成功,它返回AUDIOFOCUS_REQUEST_GRANTED。

您必须指定您使用的流,以及是否需要暂时或永久的音频焦点。当您希望只在短时间内播放音频时请求暂时聚焦(例如在播放导航指示时)。当您计划在可预见的未来播放音频时请求永久音频聚焦(例如,播放音乐时)

以下代码片段请求音乐音频流的永久音频焦点。您应该在开始播放之前立即请求音频焦点,例如当用户按下播放或下一个游戏关卡的背景音乐开始时。

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) {
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
// Start playback.
}

上述代码你就可以得到焦点播放你的音频,但是一旦你完成播放,一定要调用abandonAudioFocus()。这会通知系统您不再需要焦点和注销相关联的AudioManager.OnAudioFocusChangeListener。在放弃瞬态焦点的情况下,这允许任何中断的应用程序继续播放。

// Abandon audio focus when playback complete
am.abandonAudioFocus(afChangeListener);

但是有些时候我们并不想完全停掉另一个程序的声音,比如这时候正在进行高德导航,或者微信语音,希望另一个程序的声音小点,不要盖过自己即可,开车导航听音乐的时候,我们应该遇到过;

当请求瞬态音频焦点时,您有一个附加选项:是否要启用“低音”。通常,当良好的音频应用程序失去音频焦点时,它立即使其播放静音。通过请求一个允许回避的暂时音频焦点,你告诉其他音频应用程序它们可以接受他们继续播放,只要他们降低音量,直到焦点回到他们。

// Request audio focus for playback
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值