Как узнать, что пользователи нажимают кнопки быстрой перемотки вперед и назад на элементах управления воспроизведением в iPhone? - PullRequest
7 голосов
/ 29 августа 2010

Я хочу реализовать следующие вещи:

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

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

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

Ответы [ 2 ]

6 голосов
/ 30 августа 2010

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

То есть с использованием 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 голос
/ 04 декабря 2013

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

Я сейчас использую 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. Я не уверен, должны ли они быть реализованы или нет, если кто-то знает об этом, дайте нам знать.

...