ios - AVAudioSession 不会自动连接蓝牙 A2DP 音频?
问题描述
描述:
当我通过以下调用更改AudioSession
为时.playAndRecord
:
AVAudioSession.sharedInstance().setCategory(.playAndRecord, mode: .default, options: [.defaultToSpeaker, .allowBluetoothA2DP, .mixWithOthers])
从这些类别选项集中,我希望一旦我将蓝牙耳机与手机配对,我正在运行的应用程序应该会自动将音频路由到我的蓝牙 A2DP 耳机。相反,我的应用仍然选择使用手机扬声器。无论是通过查询音频会话实例还是以路由更改通知的形式,都没有任何迹象表明我连接了蓝牙耳机。
问题:如何确保音频会话自动连接到蓝牙耳机?
这种行为显然与不正确的代码行无关。就好像我在调用音频会话类别更改之前配对了蓝牙耳机一样,我的音频将正确地继续使用蓝牙耳机。
此外,如果我在代码调用期间使用了.allowBluetooth
类别选项(用于 HFP 而不是 A2DP),然后配对蓝牙耳机,耳机会自动连接正常。行为重现于:iPhone XR (iOS 13.6.1) 与 Apple AirPods Pro iPhone XR (iOS 13.6) 与 Senso 无线 44.1kHz 蓝牙耳机。
复制步骤:
为了 Apple 工程师的简单性和可重复性,我在WWDC 的 AVEchoTouch 演示代码的轻微修改版本上重现了该问题。由于这是 Apple 发布的一个演示项目,所有代码都是正确的。我的修改项目名为BluetoothIssue
,可以在这里找到。
第 1 步:确保您的蓝牙耳机当前未与 iPhone 配对。
第 2 步:启动“BluetoothIssue 应用程序”。当您切换“FX Out”或“Speech Out”切换时,应用程序应该正在播放声音(iPhone 扬声器外)
第 3 步:现在将您的蓝牙耳机连接到手机。即使耳机现在已连接并与手机配对,该应用程序也不会注册连接,并继续通过手机内置扬声器播放。
// 第 4-5 步(可选):查看应用的类别本身是否有问题
第 4 步:现在强制终止“BluetoothIssue”应用程序,而您的耳机仍处于连接状态。
第 5 步:现在重新启动“BluetoothIssue”应用程序。该应用程序可以正确地向蓝牙耳机播放声音。
解决方案
我了解到,如果我将模式设置为 VideoRecording,如果我打开蓝牙,iOS 将更改路由(并且我会收到路由更改通知)。如果没有这种模式,我必须允许两个蓝牙,在检测到一个之后,再次更改类别而不使用 AllowBluetooth,只是 A2DP。奇怪而缓慢的解决方案,但有效。现在我只是使用录像模式。
推荐阅读
- javascript - 全局调用异步函数时出错:“等待仅在异步函数和模块的顶层主体中有效”?
- java - JSON 文件未复制到目标文件夹
- sql - SQl 从多个 CTE 中获取计数到一个表中
- r - 何在 R 中做一个简单的功能?
- c# - Google recaptcha 中的 AssessmentName 中的评估是什么
- javascript - TSLint 抛出 'error TS2459: Module '"@azure/core-tracing"' 在本地声明 'Span',但未导出。' 和其他错误
- wpf - xaml 样式有没有办法将字体大小指定为 5 个值之一?
- ruby-on-rails - Rails 多步表单,带有一个没有 gem 的控制器
- python - 从 DataFrame 中获取所有列的第一个非空/空单元格
- node.js - 与您的 node/npm 版本不兼容...?