18 精华 • 平行世界plwd 3周前 518次点击
3月16日更新
无-障-碍-声道守护 1.0.1 → 1.0.4 更新日志
1. 重构蓝牙声道守护策略,从「实时接管」调整为「仅劫持时介入」,解决正常使用时蓝牙音质变差问题;被劫持后自动将蓝牙通话音频从8k提升至16k(效果依设备/耳机支持),通知栏弹窗提示,劫持初期可能出现1秒内轻微漏音
2. 完善声道守护配套逻辑,收紧修复后控制权归还规则,新增主界面+通知栏手动解除路由接管入口,增加无障碍声道跑偏软观察逻辑,抽象通用声道修复流程便于后续迭代
3. 持续收敛蓝牙接管策略,强化「正常使用不干扰,劫持时精准介入」逻辑,进一步提升蓝牙使用稳定性
4. 新增完整更新功能体系,支持GitHub Release版本检测,可查看当前/最新版本及更新说明
5. 新增内置更新包下载能力,支持进度展示、失败重试,保留浏览器下载备用,下载地址支持代理顺序回退
6. 新增更新包一键安装与文件管理,下载前检查设备存储空间,下载后校验安装包文件大小,安装前校验包名/签名,安装成功后自动清理旧安装包
7. 新增自动检查更新功能,应用启动后静默查更,自带节流机制(非每次启动都查),同一个新版本不重复弹窗,保留手动查更入口
8. 修复清除数据后重新要求添加磁贴的的问题。
9.,磁贴改成类似系统样式,可在控制中心快速开关APP 功能。读屏声道守护
一个修复安卓12及以上系统,读屏播报插着耳机却跳到扬声器外放的APP。插着耳机用微信、抖音之后读屏声音窜出来的,可以试试。
下载地址:https://update.wd02.com/a11y-audio-guard/app-release.apk (如果链接打不开,可在评论区留言补新链接)这是个什么问题
昨天早上好奇,为什么插着耳机的时候,读屏的声道声音有时候会从手机里窜出来,于是就趁它窜出来的时机,抓了一段手机的运行日志。
日志显示,国内很多大厂应用存在乱用手机音频设置的情况。具体来说,这些应用在播放语音消息等场景下,会把手机的声音输出切到扬声器,但存在两个问题:
1. 用完不恢复。 播放结束后不把声音设置改回去,残留的设置一直留在系统里。
2. 不看耳机状态。 插着耳机的时候音频本来就不走听筒,这个设置完全多余,但它们不管有没有插耳机都会乱改。
残留的声音设置会影响系统对读屏声道的输出判断——本来读屏的声音应该跟着耳机走,现在被这个残留设置带到了扬声器。而且诡异的是,音乐、视频这些媒体音还在耳机里,只有读屏播报跑到了外放,不仔细听还以为是自己幻觉。
目前已确认的触发场景包括:微信播放语音消息、播放视频、朋友圈刷视频,抖音播放语音消息,美团APP点击视频选项卡甚至在首页什么都不动,豆包结束视频通话等等。除此之外,很多大厂应用的相关功能可能都存在类似问题。但需要说明的是,触发这个诡异问题的路径不止这一条,目前已验证的是这条最常见的,如果后续发现其他成因,也会跟进更新。
APP怎么解决的
原理不复杂:你戴着耳机的情况下,一旦有应用把声音输出切到了扬声器或听筒,APP会通过系统状态监听捕获这个变化,然后立刻把声音输出设回耳机。
不戴耳机的时候,应用就安静待着,不占用任何资源。等你插入耳机后,会自动唤醒检测逻辑,如果发现声音输出还停留在手机扬声器上,就执行一次修复。
修复之后还有一个6秒的恢复观察窗口,会短时间多次检测,防止刚修完又被抢回去。如果连续3次检测都稳定在耳机上,就停止额外检测。平时不会一直后台扫描,不费电。
所有功能用的都是安卓系统自带的公开功能,不需要root,不需要额外的特殊权限。
关于增强守护模式
APP里有一个"增强守护"开关,默认关闭,一般情况下不建议打开。
它的原理是主动申请手机的通信模式,让系统认为当前正在通话,从而加强对耳机声音输出的控制力。检测到声音被抢时,它不会像普通模式那样直接修正,而是先释放自身的设置占用,给系统一点时间看它能不能自己恢复到耳机,恢复不了再强制接管。打电话的时候会自动暂停守护,挂断后自动恢复,不影响正常通话。
但这个模式的副作用是:开启后系统会认为你一直处于通话状态,可能导致部分应用的声音行为异常,比如有些应用会检测到通话状态而改变自己的声音设置。所以除非你发现普通模式守不住、声音反复被抢到外放,否则不要开。
怎么用
1. 安装后打开,把"启用声道守护"的开关打开
2. 按照提示授权相关权限(就是让APP能后台运行、不被手机系统清理的权限,APP内有一步步的引导)
3. 可以在下拉通知栏的快捷设置面板添加"声道修复"按钮,随时手动触发一次修复
4. 然后就不用管了,APP会在后台自动守护
支持有线耳机、Type-C耳机、蓝牙耳机(包括低延迟蓝牙耳机、助听器耳机)。
当前状态
我自己使用了一天,感觉效果还是可以的。但我手里只有一台破红米,发给过几个朋友使用,不过大家大概率都是破红米,在破红米上稳定性挺好的,其他手机咱就不知道了。
如果有人想要试试的话,下载地址在最上面,用着有问题的多顶顶帖、提个问题,或者直接在楼里说一声都行,看看效果到底怎么样,值不值得将它继续更新下去。毕竟它值得完善的地方还是很多的,比如说读屏声道被扬声器抢走这件事,成因不止这一个;再比如说既然实现了对音频路由的调整,是不是可以增加更多的玩法,一切都还不知道。
我起初只是好奇这个问题,让 AI 写了一段 Java 来复现,然后想着把这个逻辑做成 APP 挂在后台,帮我修声道,没想到它的复杂性以及未来可能有的机遇会不小,那就发出来大家一起乐呵乐呵吧。
最后说两句
这个工具是我免费做给大家用的,没有任何广告和收费,放心用。
但是安装包不要乱改乱发。 我在安装包里做了双重防篡改校验,改过的安装包会直接拒绝运行,虽然这个校验不是万能的,随便找个逆向工具就能去掉,但至少能挡住一部分乱改的人。圈子里什么人都有,我见过太多拿别人的东西改俩字就当成自己做的发出来的,还有往里面塞乱七八糟东西的。把话说在前面:大家自己用完全没问题,别随便改这个安装包拿去乱发,坑了其他朋友。要是你觉得我做的不好,想改的话仓库是开元的,自己去仓库源码编译去,别乱改我的安装包到处发,谢谢理解。
没想到这个居然可以在控制中心添加功能块。很不可思议,第一次见。
蓝牙 • 现在 已提醒 “无障碍声道守护”正在使用蓝牙通话音频 若没有使用“无障碍声道守护”进行通话,建议释放通道,以免影响媒体音质
你帮我测试一下呗,如果说关闭增强功能之后还会有这个问题吗?
官方呢?管理员呢?那么好的东西不给个精华吗?
好奇以后可以实现把读屏的声音切到不同的设备的功能吗?表示可以接受在root权限下运行。
好像免root都可以,但是这样操作会和读屏的无障碍声道本身打架,
缺点就是没有立体声了剩下的都很好
抱歉大家,研究了半个下午,发现对蓝牙设备目前这样的实现几乎已经是最好的了,暂时没有更好的办法保证蓝牙音质不下降的情况下还能让软件起作用了,
编辑了一下,已经更新了,楼上有蓝牙音质问题的朋友可以试试。
手动顶贴,谢谢加金
一个简单的使用流程参考
假设你还不知道美团的视频页面会100%触发这个bug,也不知道抖音、微信、豆包等这些你天天用的头部APP,或多或少都有这类bug的残影。话说你打开了美团APP,闲来无事的你想去美团刷刷视频挣挣金币,于是点击了视频Tab。 神奇的事情发生了:你本来戴着有线或者蓝牙耳机,但此时美团的视频和你的读屏一起跑到了耳机外面,这就是一次bug的复现。 当你装上这个 app 并且配置好了权限,打开最上面的守护开关。其实如果你有探索精神,可以打开那个蓝牙保真守护,我不知道它在你的手机上会不会更好或者更差,但是在我这里是有所提升,所以做成了开关。 当你再次打开美团,又想看看视频的时候,稍微有点不一样的事情发生了。 首先,美团将通信设备设置为了听筒或者扬声器,此时你的读屏会短暂被切走。它用来切换设备的广播被应用检测到,我们先短暂介入一次,把通信设备改回你的耳机,但是不驻留,改完就释放,观察美团是否消停。可是美团并没有消停,它又一次改变了音频路由,此时我们的应用又将它改了回来。 这样反复几次,用户体感上大概也就3~5秒的时间,我们判断美团这龟孙子死性不改,于是这次把权限强制接管并且不释放了。同时,通知栏会弹出提示: 已收起 无障碍声道守护 无障碍声道守护 下午3:04 检测到声道劫持,已重新接管耳机声道。如抢占声道应用已关闭,您可尝试解除该限制 提示其实很明确。你可以进入美团的应用设置,点击停止运行按钮,再点开刚才那条通知,手欠点一下解除限制。此时应用会正常释放权限,美团也不会再接管,这个bug就暂时避免了,程序彻底静默,等待下一次接收广播。 如果你戴着蓝牙设备,应用尝试接管通信设备的时候,你的蓝牙可能会在低延迟窄带和高音质模式之间反复横跳。只需要稍作等待,稳定之后会进入类似通话音质的窄带模式。把涉事应用结束后台,再去解除限制,你的蓝牙就可以恢复高音质输出啦! 对一些开关的说明 经典蓝牙更清晰通话音质(实验性) 仅对经典蓝牙耳机生效。修复通信路由后,会尝试争取更清晰的通话音质;不等于音乐播放音质,部分机型可能无效。 刚才说到,如果应用接管了你的蓝牙耳机权限,会让耳机走窄带模式。默认情况下,窄带模式的比特率只有8kbps,有时候听起来会很糊。开启这个开关后,会尝试向系统指定比特率为16kbps,如果蓝牙耳机和手机都支持,就会切到16kbps;如果不支持,你就当这开关不存在。 经典蓝牙保真守护(实验性) 仅对经典蓝牙耳机生效。检测到疑似劫持或手动解除接管时,会短时用静默无障碍音频确认真实出声设备,尽量减少误判和锁屏干扰。 这个功能是用来防止误判的。有时候接口层拿到的数据显示通信设备在扬声器,但实际上你的读屏工作是正常的,程序本身并不能确定到底是否正常。开启这个功能后,它会向系统认为的播放设备发出几乎无声的信号,判断读屏真正的播放声道,避免判断错误。 关于磁贴的使用 假如你不小心点开了这个应用,点击了设置磁贴,然后你又不小心从屏幕右上角下滑拉出控制中心,再不小心摸到控制中心的最后一个图标: 声道守护 开关 开启 当你手欠点一下,它就神奇地变成: 声道守护 开关 关闭 然后你会发现,应用里的总开关也跟着同步变化,想要快速开关应用,再也不用通过通知或者桌面图标进入了。
点赞 支持。
顶个帖,我更新了。
大佬能不能考虑一下加一个指定读屏声音在蓝牙设备或者是在手机播放的功能啊?
这个功能起初我以为可以的,然后查了一下,只有屏幕阅读器自己可以控制自己的声道从哪个设备输出,所以应该是做不了的,就算投机取巧做出来之后也是不稳定的。
v1.0.7
新增“可能相关应用”提示
读屏声道发生异常时,现在会尽量提示当时可能相关的应用,方便排查是谁抢了外放。
这部分线索会结合异常发生时间和前台应用变化来判断。
如需显示该线索,需要开启“应用使用情况访问”权限。
通知与提醒更清晰
常驻提示和短提醒现在更贴近系统通知频道管理,用起来更直观。
可以分别调整“读屏保护常驻提示”和“读屏异常短提醒”,减少打扰更方便。
主界面也补充了更清楚的通知状态和设置入口。
蓝牙耳机体验更稳
修复了部分保护设置重开应用后不一致的问题。
蓝牙“保真保护”现在默认开启,更适合大多数蓝牙耳机场景。
在持续保护期间,蓝牙相关状态处理也更稳定。
状态刷新与异常恢复更及时
修复了服务重新连接后,主界面状态没有及时刷新的问题。
优化了设备识别和状态判断,减少误判带来的困扰。
保护状态、提醒状态和记录显示现在更一致。
文案和界面提示更顺
收紧了一批中文文案,减少重复解释和过长说明。
稳定性与细节优化
对异常恢复、蓝牙处理和状态流转做了进一步整理。
补充了部分测试和文档,便于后续继续优化问题场景。
前排啊