1

AudioSession が初期化された後に AudioSessionInterruptionListener を変更または無効にする方法が必要です。

理由は次のとおりです。一部のユース ケースでは、オーディオ録音を使用してアプリをバックグラウンドで実行する必要があるため、オーディオ バックグラウンド モードが設定されています。これは機能します。呼び出しやその他の割り込みが発生した場合、他のオブジェクトに記録を完全に停止するように通知する必要があります-これは機能します。次に、呼び出した AudioSession でアプリが完了すると、AudioSessionSetActive(false);これが機能します (セッションがアクティブな状態でアプリがバックグラウンドに送信されると、上部に赤いバーが表示されます。セッションが非アクティブな場合、赤いバーは表示されません。ただし、技術的には、アプリはまだ「アクティブな」バックグラウンド モードになっていると思います)。

でも!録音が完了し、アプリがバックグラウンドに送信され、オーディオ セッションが既に非アクティブ化されている場合、通話が着信した場合、または Siri がアクティブ化された場合でも、アプリは AudioSessionInterruptionListener コールバックを受け取ります。はい、コードを追加して、アプリが現在割り込みに応答しているかどうかをテストできます。ただし、これはバグだと思います。AudioSession を無効にすると、割り込みの呼び出しが停止するはずです。実際、すべてのオーディオ セッション/プロパティ リスナーの呼び出しが停止するはずです。

AudioSessionInterruptionListener を変更または無効にするにはどうすればよいですか? または、これを尋ねる別の方法かもしれませんが、アプリが必要のないときにバックグラウンド モードを「使用」しないようにするにはどうすればよいですか?

追加情報

さて、iOS 6 では AudioSession 割り込み用の NSNotifications があるようです:AVAudioSessionDidBeginInterruptionNotificationAVAudioSessionDidEndInterruptionNotification. ただし、iOS 5.1 以降をサポートしているため、これは役に立ちません。そして、私が新しい通知を見つけた同じドキュメントは、Obj-C インターフェイス AVAudioSession のデリゲート プロパティが (IOS 6 で) 減価償却されていることを示しているため、おそらくそれを使用してデリゲートを設定/変更するべきではありません (そして Obj を取得します)。 -C 割り込みコールバック)。

考えられる回避策は、iOS バージョンをテストし、6.0 未満でデリゲートを設定および設定解除し、6.0 以降で NSNotifications をリッスンすることだと思います (これは 6.0 未満では表示されないため、壊れてはなりません)。ただし、これはおかしなことのようです。

4

1 に答える 1

0

完了したら、AudioSessionInitialize を呼び出して AudioSessionInterruptionListener (つまり、割り込みを処理する関数) に NULL を渡してみましたか?

インターフェイスは次のとおりです。

   OSStatus AudioSessionInitialize (
       CFRunLoopRef                      inRunLoop,
       CFStringRef                       inRunLoopMode,
       AudioSessionInterruptionListener  inInterruptionListener,
       void                              *inClientData
);

ドキュメントには明示的に次のように記載されています。

アプリケーションは、他の Audio Session Services 呼び出しを行う前に、この関数を呼び出す必要があります。必要に応じてオーディオ セッションをアクティブ化および非アクティブ化できますが (AudioSessionSetActive を参照)、初期化は 1 回だけにしてください。

于 2013-07-17T02:34:39.687 に答える