4

アプリはオーディオを録音し、通話などの中断があるとオーディオの録音を停止し、通話が終了するとオーディオの録音を再開する必要があります。

現在、電話があるとアプリは登録しますが、電話を切ると、アプリは中断が終了したことを登録しません。(他のアプリは開いていません)。

関数デリゲートを使用

私のViewControllerで以下のコードを参照してください。

func audioRecorderBeginInterruption(recorder: AVAudioRecorder){
    print("* * * * * * * inside begin interruption")}

func audioRecorderEndInterruption(recorder: AVAudioRecorder, withFlags flags: Int) {
    // THIS NEVER PRINTS, EVEN WHEN PHONE IS HUNG UP
    print("* * * * * * * inside end interruption")
}

通知あり

また、通知で割り込みを処理しようとしましたが、電話を受けて電話を拒否しない限り、.Ended はまだ処理されません。AppDelegate のコードを参照してください

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        let center = NSNotificationCenter.defaultCenter()

        center.addObserver(self,
            selector:"sessionInterrupted:",
            name:AVAudioSessionInterruptionNotification,
            object:AVAudioSession.sharedInstance()) //self.myViewController.audioSession)


        return true
    }



 func sessionInterrupted(notification: NSNotification){
                if let typeValue = notification.userInfo?[AVAudioSessionInterruptionTypeKey] as? NSNumber{
                    if let type = AVAudioSessionInterruptionType(rawValue: typeValue.unsignedLongValue){
                        if type == .Began{
                            print("interruption: began")
                        } else{
                            // THIS ALSO NEVER PRINTS
                            print("interruption: ended")
                        }
        }

うまくいかなかった関連ソリューション

  1. [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];解決策:機能しなかったものを 追加する
  2. 解決策:MixWithOthersオーディオの再生を再開する場合は機能する可能性がありますが、私の場合はオーディオの録音を再開する場合は機能しません

現在の仮説

私の現在の仮説では、「終了」の割り込みは、電話がかかってきて電話を拒否したときなどの割り込みのみが対象であり、実際に電話を取り、少し話してから電話を切った場合ではありません。私の推測では、ジェイルブレイクされた電話を使用しない限り、後者のケースを検出する方法はありません。

ここでより広範な方法で拡張: iOS AVAudioSession 中断通知が期待どおりに機能しない

この仮説は、DropVox の FAQで検証されているようです。

一度に 1 つのアプリだけが音声を制御できます。DropVox が記録中に別のアプリが制御を引き継いだ場合、それは「中断」と呼ばれます。中断が終了すると、DropVox がフォアグラウンドにある場合にのみ記録を再開できます7 。そのため、「バックグラウンドで記録」設定を使用しないように注意します。

ルーティングを使用してマイクが使用されていることを検出することで、中断を処理できる可能性があります。しかし、バックグラウンドでオーディオ録音を再度有効にできるとは思わないので、アプリがフォアグラウンドに戻ったらそうします。

そうですか?

4

1 に答える 1

-2

applicationWillResignActive:/applicationDidBecomeActive:関数内でaudiosessionをアクティブにしないでください。

電話がかかってきたとき、システムはオーディオセッションを所有しています。この時点で、関数[[AVAudioSession sharedInstance] setActive:YES error:&error]内のapplicationWillResignActive:/applicationDidBecomeActive:関数を呼び出すと、アプリはオーディオセッションを所有します(実際には、電話がかかってきたときにオーディオセッションをアクティブにできないはずですが、わかりませんtrue を返す理由)、終了割り込みを受信しません。

于 2016-08-01T08:55:12.370 に答える