MPMoviePlayerController - обнаружение нажатия кнопок Next/Prev

Я использую MPMoviePlayerController, и мне нужно определить нажатие кнопок Next/Prev. Я пробовал несколько вещей, ни одна из которых, похоже, не работает.

Вот что я пробовал:

  • события дистанционного управления
-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    [self becomeFirstResponder];
}  
-(void) viewWillDisappear:(BOOL)animated
{
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];
    [self resignFirstResponder];
    [super viewWillDisappear:animated];
}  
-(BOOL)canBecomeFirstResponder
{
    return YES;
}  
-(void)remoteControlReceivedWithEvent:(UIEvent *)receivedEvent
{
    // stuff
}

Проблема remoteControlReceivedWithEvent метод никогда не вызывается. Я читал, что это не будет работать в версии iOS выше 6 - я работаю над iOS 7

  • уведомления

Я попытался использовать MPMoviePlayerPlaybackStateDidChangeNotification и проверить на MPMoviePlaybackStateSeekingForward или MPMoviePlaybackStateSeekingBackward - к сожалению, это состояние воспроизведения задается при перетаскивании полосы воспроизведения, а не при нажатии кнопок "Далее" / "Назад".

Любые идеи?

Ответ 1

Извините, я не очень хорошо понимаю вашу проблему, но если вы хотите использовать элементы управления из своего приложения в Центре управления, вы можете использовать:

      // You need cath the singleton
MPRemoteCommandCenter *myRemote = [MPRemoteCommandCenter sharedCommandCenter];
//And add the selector you can fire depends on the button, a couple of examples:
[myRemote.playCommand addTarget:self action:@selector(myPlayMethods)];
[myRemote.nextTrackCommand addTarget:self action:@selector(myNextTrackMethods)];

Ответ 2

попробуйте зарегистрироваться для события в:

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

    // Turn on remote control event delivery
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

    // Set itself as the first responder
    [self becomeFirstResponder];
}

Также не устанавливайте свойство kAudioSessionProperty_OverrideCategoryMixWithOthers

Ответ 3

Вы пробовали MPMoviePlayerNowPlayingMovieDidChangeNotification? Если это не сработает, я бы предложил перейти к API более низкого уровня, то есть AVPlayer. Он обеспечивает мелкозернистый контроль над всеми действиями во время воспроизведения видео и в противном случае.

Ответ 4

Вам необходимо зарегистрироваться для обработки уведомления для moviePlayerLoadStateChanged. Когда вы нажимаете кнопки next/prev, вызывается moviePlayerLoadStateChanged, а loadState будет MPMovieLoadStateUnknown

-(void)registerMyStuff {
    [[NSNotificationCenter defaultCenter] addObserver:self
                            selector:@selector(moviePlayerLoadStateChanged:)
                                    name:MPMoviePlayerLoadStateDidChangeNotification
                                           object:self.mpc];
}

- (void)moviePlayerLoadStateChanged:(NSNotification *)notification
{
    MPMoviePlayerController *moviePlayer = notification.object;
    MPMovieLoadState loadState = moviePlayer.loadState;

    if(loadState == MPMovieLoadStateUnknown)
    {
        // this is where the next/prev buttons notify
        // there is no video in this state so load one
        // just reload the default movie

        NSLog(@"MPMovieLoadStateUnknown");
        self.mpc.contentURL = self.fileURL;
        [self.mpc prepareToPlay];

        return;
    }
    else if(loadState & MPMovieLoadStatePlayable)
    {
        NSLog(@"MPMovieLoadStatePlayable");
    }
    else if(loadState & MPMovieLoadStatePlaythroughOK)
    {
        NSLog(@"MPMovieLoadStatePlaythroughOK");
    } else if(loadState & MPMovieLoadStateStalled)
    {
        NSLog(@"MPMovieLoadStateStalled");
    }
}

Ответ 5

Вы меняете MPMoviePlayerController overlayView так же, как change UIImagePickerController overlayView, чтобы реализовать нужную вам функцию.

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc]
    initWithContentURL:someUrl];

moviePlayer.movieControlMode = MPMovieControlModeHidden;
[moviePlayer play];

NSArray *windows = [[UIApplication sharedApplication] windows];

if ([windows count] > 1) {

     UIWindow *moviePlayerWindow = [[UIApplication sharedApplication] keyWindow];
     [moviePlayerWindow addSubview:yourCustomOverlayView];
}