我正在开发一个可以通过 HFP 设备播放音乐的项目。但是这里有一个问题,我想在播放音乐时检测是否连接了 HFP 或 A2DP。
现在我正在使用 AVFoundation 框架来执行此操作。这是代码:
- (BOOL)isConnectedToBluetoothPeripheral
{
BOOL isMatch = NO;
NSString* categoryString = [AVAudioSession sharedInstance].category;
AVAudioSessionCategoryOptions categoryOptions = [AVAudioSession sharedInstance].categoryOptions;
if ((![categoryString isEqualToString:AVAudioSessionCategoryPlayAndRecord] &&
![categoryString isEqualToString:AVAudioSessionCategoryRecord]) ||
categoryOptions != AVAudioSessionCategoryOptionAllowBluetooth)
{
NSError * error = nil;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionAllowBluetooth
error:&error];
if (error) {
[[AVAudioSession sharedInstance] setCategory:categoryString
withOptions:categoryOptions
error:&error];
return isMatch;
}
}
NSArray * availableInputs = [AVAudioSession sharedInstance].availableInputs;
for (AVAudioSessionPortDescription *desc in availableInputs)
{
if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothA2DP] || [[desc portType] isEqualToString:AVAudioSessionPortBluetoothHFP])
{
isMatch = YES;
break;
}
}
if (!isMatch)
{
NSArray * outputs = [[[AVAudioSession sharedInstance] currentRoute] outputs];
for (AVAudioSessionPortDescription * desc in outputs)
{
if ([[desc portType] isEqualToString:AVAudioSessionPortBluetoothA2DP] || [[desc portType] isEqualToString:AVAudioSessionPortBluetoothHFP])
{
isMatch = YES;
break;
}
}
}
NSError * error = nil;
[[AVAudioSession sharedInstance] setCategory:categoryString
withOptions:categoryOptions
error:&error];
return isMatch;
}
效果很好,但又带来一个问题:在播放音乐时,使用这种方法检测HFP连接会导致音乐播放中断约两秒。
所以我尝试了另一种可以减少检测HFP连接效果的方法。我正在使用旗帜
static BOOL isHFPConnectedFlag
指示是否连接了 HFP 或 A2DP。我使用以前的方法只检测一次连接(当应用程序启动时)并将结果保存到 isHFPConnectedFlag 中。更重要的是,我观察 AudioSessionRouteChange 来同步连接状态:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAudioSessionRouteChangeWithState:) name:AVAudioSessionRouteChangeNotification object:nil];
当路由更改原因是AVAudioSessionRouteChangeReasonNewDeviceAvailable
或者AVAudioSessionRouteChangeReasonOldDeviceUnavailable
我可以知道 HFP 连接或断开连接。不幸的是,当我在 iPhone 中连接一些 HFP 时,系统不会发布此通知,因此在这种情况下我无法检测到连接。
有谁知道实现这一点的原因或更好的方法(检测 HFP 连接而不中断音乐播放)?