Я использую Xamarin, так что это C #, но следующий код работает для меня. Сначала я установил, что мой AppDelegate реализует методы делегата AVAudioSession, включая IAVAudioSessionDelegate
public partial class AppDelegate: UIApplicationDelegate, IAVAudioSessionDelegate
Я добавил переменную в класс AppDelegate для аудиосеанса
public static AVAudioSession AudioSession;
В переопределении метода FinishedLaunching:
AudioSession = AVAudioSession.SharedInstance();
AudioSession.Delegate = this;
error = AudioSession.SetCategory( AVAudioSessionCategory.Playback, AVAudioSessionCategoryOptions.DuckOthers );
AudioSession.SetMode( new NSString( "AVAudioSessionModeMoviePlayback" ), out error );
Два соответствующих метода делегата в AppDelegate.cs:
[Export( "beginInterruption" )]
public void BeginInterruption()
{
PlayerViewController.BeginSessionInterruption();
}
[Export( "endInterruptionWithFlags:" )]
public void EndInterruption( AVAudioSessionInterruptionFlags flags )
{ // ignore the flags so we're not dependent on the interrupting event saying that we can resume
PlayerViewController.ResumeAfterSessionInterruption();
}
My AppDelegate также имеет переопределение OnActivation для включения видеодорожек, если оно является видеоустройством, и переопределение DidEnterBackground, чтобы отключить видеодорожки мультимедиа, но при этом воспроизводить звук.
В методе PlayerViewController.BeginSessionInterruption () я не могу посмотреть Player.Rate, чтобы увидеть, запущен ли проигрыватель в данный момент, потому что прерывание будильника или телефонного звонка уже приостановило игрока. Из раздела «Реагирование на прерывания» в Руководстве по программированию аудиосеансов Apple, с моим акцентом:
- Ваше приложение активно, воспроизводит звук.
- Приходит телефонный звонок. Система активирует аудио сеанс телефонного приложения.
- Система деактивирует ваш аудио сеанс. На этом этапе * воспроизведение в вашем приложении остановлено *.
- Система вызывает функцию обратного вызова прослушивателя прерываний, указывающую, что ваш сеанс был деактивирован.
...
Кнопка Play моего PlayerViewController имеет свойство Paused для переключения между Play и Pause и рисования соответствующего изображения кнопки. Поэтому вместо проверки Player.Rate я смотрю, имеет ли свойство кнопки Paused значение false:
public void BeginSessionInterruption()
{
PlayerWasRunningOnInterruption = !btnPlay.Paused;
TogglePlayPause( true ); // put the Play button into the Paused state to agree with the player being stopped
}
public void ResumeAfterSessionInterruption()
{
NSError error;
AppDelegate.AudioSession.SetActive( true, AVAudioSessionSetActiveOptions.NotifyOthersOnDeactivation, out error ); // always reactivate the audio session
if ( PlayerWasRunningOnInterruption )
{
// rewind a little bit
// call btnPlayClick to resume the playback as if the user pressed the Play button
}
}