2

AVPlayerを使用して、さまざまなソース(iPodミュージックライブラリを含む)からサウンドを再生しています。AVPlayerはより低レベルのAVAudioPlayerであるため、中断を自分で処理する必要があります。AVAudioPlayerの使用はオプションではありません!

Appleの開発者向けドキュメントでは、リスナーをリッスンするかAVAudioSessionInterruptionNotification、リスナーを設定することに言及していますAudioSessionInitialize。ただし、そうすると、中断が終了したときにのみ通知を受け取りますが、ドキュメントがあるため、アプリは両方を処理できるはずです。

オーディオセッションを初期化するために次のコードを使用しています:(簡略化されたバージョン、重要でない行を削除)

AudioSessionInitialize(NULL, NULL, ARInterruptionListenerCallback, nil);
UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
AudioSessionSetActive(true);

そして、リスナーは次のようになります。

void ARInterruptionListenerCallback(void *inUserData, UInt32 interruptionState) {
    if (interruptionState == kAudioSessionBeginInterruption) {
        // Here is the code which is never called...
    }
    else if (interruptionState == kAudioSessionEndInterruption) {
        // But this case will be executed!
    }
}

ところで。このコードは、電話などの中断があったときに実行されることを期待しています。Appleが中断と宣言していることを誤解していますか?

4

1 に答える 1

5

iOS 6にはバグがあります。割り込みコードがbegininterruptのために呼び出されることはないようです-これには、古い非推奨のメソッド(AVAudioSessionデリゲートを使用)と新しい通知メソッドの両方が含まれます。

私自身と他の数人がAppleに重大度の高いバグ要求を提起したので、彼らの注意を引くために同じこと( bugreport.apple.com )を行うことをお勧めします。

割り込みを何に使用しているのかわかりませんが、必要に応じて割り込み後にオーディオを再開できるようにしたり、インターフェイスの再生/一時停止ボタンを更新したりするために使用していました。AVPlayerのrateプロパティを監視する方法を変更して、再生/一時停止ボタンを切り替え、中断後にオーディオを再開できないようにする必要がありました。

編集:このスレッドを参照してください

于 2012-10-14T10:14:19.900 に答える