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];
}