3

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 接続を検出すると、音楽の再生が約 2 秒間中断されます。

そこで、HFP接続を検出する効果を減らすことができる別の方法を試しました。フラグを使用しています

static BOOL isHFPConnectedFlag

HFP または A2DP が接続されているかどうかを示します。以前の方法を使用して、接続を 1 回だけ検出し (アプリの起動時)、結果を isHFPConnectedFlag に保存します。さらに、接続ステータスを同期する AudioSessionRouteChange を観察します。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleAudioSessionRouteChangeWithState:) name:AVAudioSessionRouteChangeNotification object:nil];

ルート変更理由が である場合HFP が接続されているか切断されているかを知ることができる場合AVAudioSessionRouteChangeReasonNewDeviceAvailableAVAudioSessionRouteChangeReasonOldDeviceUnavailable残念ながら、iPhone に HFP を接続すると、システムはこの通知を送信しないため、この状況では接続を検出できません。

これを実装する理由またはより良い方法を知っている人はいますか (音楽の再生を中断せずに HFP 接続を検出する)?

4

2 に答える 2