7

Я хочу осуществить следующие вещи,Как я могу знать, пользователи нажимают перемотку вперед и быстрые кнопки перемотки на панели управления воспроизведением в iPhone

  1. App работает музыку или видео (с помощью MPMoviePlayerController) в фоновом режиме.
  2. Пользователь дважды нажимает кнопку «Домой» и переходит на первый экран, на котором отображаются элементы управления воспроизведением (быстрая перемотка назад, воспроизведение или пауза, кнопки быстрой перемотки вперед).
  3. Пользователь быстро нажимает кнопку быстрой перемотки вперед или назад. Затем приложение воспроизводит предыдущую или следующую музыку или видео.

Для 3-го шага я должен знать, какую кнопку нажать. (Как я знаю, текущий игровой элемент приостановлен, остановлен .. с использованием MPMoviePlayerPlaybackStateDidChangeNotification уведомлений).

Какое уведомление я должен зарегистрировать? Или есть другие подходы?

+0

Как я могу воспроизводить звуки с помощью MPMoviePlayerController? –

ответ

6

Я получил ответ сам.

Это используется для запуска beginReceivingRemoteControlEvents для UIApplication.

В соответствующем месте (например, viewWillAppear :) поместите следующий код

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
[self becomeFirstResponder]; 

И-контроллер должен реализовать следующий метод возвращения YES

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

И тогда вы можете получить удаленный событие контроллера в следующем методе.

- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 

    if(event.type == UIEventTypeRemoteControl) { 
     NSLog(@"sub type: %d", event.subtype); 
    } 
} 

И event.subtype, как показано ниже,

typedef enum { 
    // available in iPhone OS 3.0 
    UIEventSubtypeNone        = 0, 

    // for UIEventTypeMotion, available in iPhone OS 3.0 
    UIEventSubtypeMotionShake      = 1, 

    // for UIEventTypeRemoteControl, available in iPhone OS 4.0 
    UIEventSubtypeRemoteControlPlay     = 100, 
    UIEventSubtypeRemoteControlPause    = 101, 
    UIEventSubtypeRemoteControlStop     = 102, 
    UIEventSubtypeRemoteControlTogglePlayPause  = 103, 
    UIEventSubtypeRemoteControlNextTrack   = 104, 
    UIEventSubtypeRemoteControlPreviousTrack  = 105, 
    UIEventSubtypeRemoteControlBeginSeekingBackward = 106, 
    UIEventSubtypeRemoteControlEndSeekingBackward = 107, 
    UIEventSubtypeRemoteControlBeginSeekingForward = 108, 
    UIEventSubtypeRemoteControlEndSeekingForward = 109, 
} UIEventSubtype; 
+1

Это, похоже, не работает в симуляторе, работающем на устройстве iPhone 4.1? Это так, или я делаю что-то неправильно? –

+0

Кажется, у меня точно такая же настройка, но я просто не могу получить никаких событий. – JOM

+1

Plz проверка если вы действительно сталFirstResponder. И проверьте, будут ли другие классызываться startFirstResponder после класса, который получит события, называемые startFirstResponder. – alones

1

Это может быть очень поздно ответ, но, как я заметил, что там не много Q/Как насчет воспроизведения звука и пультов дистанционного управления, поэтому я надеюсь, что мой ответ поможет другим, у кого такая же проблема:

В настоящее время я использую AVAudioPlayer, но метод удаленного управления, который равен - (void)remoteControlReceivedWithEvent:(UIEvent *)event, не должен быть связан с типом используемого вами игрока.

Чтобы получить вперед и назад кнопки на работе блокировки экрана, выполните следующее:

В viewDidLoad методе ваш взгляд контроллера добавить следующий код:

//Make sure the system follows our playback status - to support the playback when the app enters the background mode. 
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; 
[[AVAudioSession sharedInstance] setActive: YES error: nil]; 

Затем добавить эти методы: viewDidAppear: : (если они еще не реализованы)

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    //Once the view has loaded then we can register to begin recieving controls and we can become the first responder 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [self becomeFirstResponder]; 
} 

viewWillDisappear: (если не реализован уже)

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    //End recieving events 
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
    [self resignFirstResponder]; 
} 

И:

//Make sure we can recieve remote control events 
- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 

- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 
    //if it is a remote control event handle it correctly 
    if (event.type == UIEventTypeRemoteControl) 
    { 
     if (event.subtype == UIEventSubtypeRemoteControlPlay) 
     { 
      [self playAudio]; 
     } 
     else if (event.subtype == UIEventSubtypeRemoteControlPause) 
     { 
      [self pauseAudio]; 
     } 
     else if (event.subtype == UIEventSubtypeRemoteControlTogglePlayPause) 
     { 
      [self togglePlayPause]; 
     } 

     else if (event.subtype == UIEventSubtypeRemoteControlBeginSeekingBackward) 
     { 
      [self rewindTheAudio]; //You must implement 15" rewinding in this method. 
     } 
     else if (event.subtype == UIEventSubtypeRemoteControlBeginSeekingForward) 
     { 
      [self fastForwardTheAudio]; //You must implement 15" fastforwarding in this method. 
     } 

    } 
} 

Это работает отлично в мое приложение, однако, если вы хотите, чтобы иметь возможность получать события дистанционного управления во всех контроллерах зрения, то вы должны установить его в AppDelegate.

ПРИМЕЧАНИЕ!Этот код работает нормально на данный момент, но я вижу еще два подтипа: UIEventSubtypeRemoteControlEndSeekingBackward и UIEventSubtypeRemoteControlEndSeekingBackward. Я не уверен, что они должны быть реализованы или нет, если кто-то знает об этом, сообщите нам об этом.

+0

Тестировали ли вы в iOS 8? потому что, кажется, не работает @Neeku – NorthBlast

+0

@NorthBlast нет, я был на этом больше года назад, но вам нужно будет обновить и протестировать его на iOS 8 в ближайшее время ... – Neeku

+0

@NorthBlast Кстати, вы можете подумать, что он не работает , но вам действительно нужно долгое нажатие (коснитесь и удерживайте некоторое время), чтобы перемотать его назад. Это не так хорошо, как собственное приложение Podcast от Apple, но с ограниченным доступом к библиотеке это достаточно удовлетворительно. – Neeku