当airpods连接时,routeChangeNotification在音频切换到扬声器后检测newDeviceAvailable
Posted
技术标签:
【中文标题】当airpods连接时,routeChangeNotification在音频切换到扬声器后检测newDeviceAvailable【英文标题】:when airpods conected, routeChangeNotification detecting newDeviceAvailable after the audio has been switched to speaker 【发布时间】:2019-03-27 20:54:13 【问题描述】:当我将 airpods 连接到我的 iphone 并尝试将音频覆盖到扬声器时,音频默认返回到 airpods。我没有遇到任何其他蓝牙设备或其他音频选项的问题。连接airpods时如何使扬声器输出粘连?
这是我设置音频会话的方式:
var err: Error? = nil
let session = AVAudiosession.sharedInstance()
do
try session.setCategory(AVAudioSession.Category.playAndRecord, mode: .voiceChat, options: [.allowBluetooth, .allowBluetoothA2DP, .mixWithOthers])
catch
NSLog("Unable to change audio category because : \(String(describing: err?.localizedDescription))")
err = nil
try? session.setMode(AVAudioSession.Mode.voiceChat)
if err != nil
NSLog("Unable to change audio mode because : \(String(describing: err?.localizedDescription))")
err = nil
let sampleRate: Double = 44100.0
try? session.setPreferredSampleRate(sampleRate)
if err != nil
NSLog("Unable to change preferred sample rate because : \(String(describing: err?.localizedDescription))")
err = nil
try? session.setPreferredIOBufferDuration(0.005)
if err != nil
NSLog("Unable to change preferred sample rate because : \(String(describing: err?.localizedDescription))")
err = nil
行动表上的发言人行:
let speakerOutput = UIAlertAction(title: "Speaker", style: .default, handler:
(alert: UIAlertAction!) -> Void in
self.overrideSpeaker(override: true)
)
for description in currentRoute.outputs
if convertFromAVAudioSessionPort(description.portType) == convertFromAVAudioSessionPort(AVAudioSession.Port.builtInSpeaker)
speakerOutput.setValue(true, forKey: "checked")
break
speakerOutput.setValue(UIImage(named: "ActionSpeaker.png")?.withRenderingMode(.alwaysOriginal), forKey: "image")
optionMenu.addAction(speakerOutput)
我在这里换了演讲者,布尔值确实是真的:
func overrideSpeaker(override : Bool)
do
let port: AVAudioSession.PortOverride = override ? .speaker : .none
try session.overrideOutputAudioPort(port)
catch
NSLog("audioSession error toggling speaker: \(error.localizedDescription)")
这是我的路由更改委托,我先得到覆盖,然后是 newDeviceAvailable:
@objc func handleRouteChange(_ notification: Notification)
guard let userInfo = notification.userInfo,
let reasonValue = userInfo[AVAudioSessionRouteChangeReasonKey] as? UInt,
let reason = AVAudioSession.RouteChangeReason(rawValue:reasonValue) else
return
switch reason
case .newDeviceAvailable,
.categoryChange:
var audioShown = false
for output in session.currentRoute.outputs where output.portType != AVAudioSession.Port.builtInReceiver && output.portType != AVAudioSession.Port.builtInSpeaker
self.showAudio()
audioShown = true
break
if !audioShown
self.showSpeaker()
break
case .routeConfigurationChange:
break
case .override:
break
default: ()
【问题讨论】:
你读过你自己的代码吗?您正在创建一个err
变量,但是您从不使用它......您调用的方法应该如何知道它们应该将错误写入err
?我建议你使用try
-catch
。
err 无关紧要,因为它永远不会被击中
当然它永远不会被击中,因为你没有使用它。尝试改用 try-catch。
你是在说我设置音频的时候吗?
也许这个答案可以在这里提供帮助:***.com/questions/53922387/…
【参考方案1】:
虽然这不是最佳答案,但您可以尝试在调用 overrideOutputAudioPort() 之前调用 setCategory(),并且在这样做时省略 .allowBluetooth 选项。然后,如果他们取消选中扬声器,您将不得不将其放回原处。
使用 AVAudioSession.currentRoute.availableInputs 中的元数据,您可以将此逻辑的使用限制为仅在用户连接了 airpods 时使用。
【讨论】:
以上是关于当airpods连接时,routeChangeNotification在音频切换到扬声器后检测newDeviceAvailable的主要内容,如果未能解决你的问题,请参考以下文章