私はHFPデバイス経由で音楽を再生できるプロジェクトに取り組んでいます。しかし、ここでは、音楽が再生されているときにHFPまたはA2DPが接続されているかどうかを検出したいという問題があります。iOSで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の接続を検出するために、このメソッドを使用すると、音楽が約2秒間割り込み遊ぶようになります。
私はHFP接続を検出する効果を減らすことができる別の方法を試しました。私は旗を使用しています
static BOOL isHFPConnectedFlag
HFPまたはA2DPが接続されているかどうかを示しています。以前の方法で接続を一度だけ検出し(アプリケーションが起動しているとき)、isHFPConnectedFlagに結果を保存します。しかも、私はAudioSessionRouteChangeが接続状態を同期するために守っ:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAudioSessionRouteChangeWithState:) name:AVAudioSessionRouteChangeNotification object:nil];
ルート変更の理由がAVAudioSessionRouteChangeReasonNewDeviceAvailable
またはAVAudioSessionRouteChangeReasonOldDeviceUnavailable
私はHFPを接続または切断されて知ることができるである
誰でも、これを実装する理由や良い方法を知っていますか?音楽再生中断なしでHFP接続を検出していますか?ありがとうございました