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

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

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

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

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

2 ответа

Решение

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

Это с помощью 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;

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

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

Другие вопросы по тегам