2012-08-08 73 views
0

我想允許我的鍵盤上的控件在我的應用程序中工作。這些控件使用Apple的遠程控制事件(beginReceivingRemoteControlEvents,endReceivingRemoteControlEventsremoteControlReceivedWithEvent);但我似乎無法得到這與MPMoviePlayerController工作。MPMoviePlayerController無法使用remoteControlReceivedWithEvent

儘管在開始時調用了beginReceivingRemoteControlEvents,但在程序開始時我看不到任何事件。 播放視頻期間沒有看到任何事件。 我在關閉視頻後看到事件。

從上面看來,MPMoviePlayerController的音頻流似乎禁用了控件。但我不知道如何改變這一點。我嘗試使用[moviePlayer setUseApplicationAudioSession:NO];更改音頻以使用系統會話,但它什麼也沒做。

這是我的設置。我的應用程序代理是UIViewController。我將主窗口的根視圖控制器設置爲應用程序委託,將視圖添加到視圖控制器,並在視圖控制器中添加與視頻相關的部分。

- (BOOL)canBecomeFirstResponder { 
    return YES; 
} 
- (void)tableView:(UITableView *)theTableView didSelectRowAtIndexPath:(NSIndexPath *)theIndexPath { 
    NSString *file = [[MGMFilesPath stringByExpandingTildeInPath] stringByAppendingPathComponent:[files objectAtIndex:[theIndexPath indexAtPosition:1]]]; 
    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    [audioSession setCategory:AVAudioSessionCategoryPlayback error:nil]; 
    [audioSession setActive:YES error:nil]; 
    NSLog(@"%d", [self isFirstResponder]); 

    moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:file]]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playbackFinished:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 

    if ([moviePlayer respondsToSelector:@selector(setFullscreen:animated:)]) { 
     [[self view] addSubview:[moviePlayer view]]; 
     [moviePlayer setFullscreen:YES animated:YES]; 
     [moviePlayer play]; 
    } else { 
     [moviePlayer play]; 
    } 
    [fileView deselectRowAtIndexPath:theIndexPath animated:NO]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; 
    [self becomeFirstResponder]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; 
    [self resignFirstResponder]; 
} 

- (void)remoteControlReceivedWithEvent:(UIEvent *)event { 
    NSLog(@"remoteControlReceivedWithEvent: %@", event); 
    if (event.type==UIEventTypeRemoteControl) { 
     if (event.subtype==UIEventSubtypeRemoteControlPlay) { 
      NSLog(@"Play"); 
     } else if (event.subtype==UIEventSubtypeRemoteControlPause) { 
      NSLog(@"Pause"); 
     } else if (event.subtype==UIEventSubtypeRemoteControlTogglePlayPause) { 
      NSLog(@"Play Pause"); 
     } 
    } 
} 

- (void)exitedFullscreen:(NSNotification*)notification { 
    [[moviePlayer view] removeFromSuperview]; 
    [moviePlayer stop]; 
    [moviePlayer release]; 
    moviePlayer = nil; 
    [[AVAudioSession sharedInstance] setActive:NO error:nil]; 
} 

- (void)playbackFinished:(NSNotification*)theNotification { 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:moviePlayer]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer]; 
    NSNumber *reason = [[theNotification userInfo] objectForKey:MPMoviePlayerPlaybackDidFinishReasonUserInfoKey]; 
    if ([reason intValue]!=MPMovieFinishReasonUserExited) { 
     [moviePlayer setFullscreen:NO animated:YES]; 
     [[moviePlayer view] removeFromSuperview]; 
     [moviePlayer stop]; 
     [moviePlayer release]; 
     moviePlayer = nil; 
     [[AVAudioSession sharedInstance] setActive:NO error:nil]; 
    } 
    NSLog(@"%d", [self isFirstResponder]); 
} 

正如你可以在上面的代碼中看到的,我驗證,這是第一個響應,它是,所以我知道這不是第一個響應的問題。

有人能幫我確認這個數字嗎?

感謝

回答

1

顯然,是的MPMoviePlayerController不走此路。我最終做的是使用MPMoviePlayerViewController覆蓋remoteControlReceivedWithEvent定製控件。以下是我目前使用的代碼。

@interface MGMMoviePlayerViewController : MPMoviePlayerViewController 
- (void)remoteControlReceivedWithEvent:(UIEvent *)event; 
@end 

@implementation MGMMoviePlayerViewController 
- (void)remoteControlReceivedWithEvent:(UIEvent *)theEvent { 
    if (theEvent.type==UIEventTypeRemoteControl) { 
     if (theEvent.subtype==UIEventSubtypeRemoteControlPlay) { 
      [[self moviePlayer] play]; 
     } else if (theEvent.subtype==UIEventSubtypeRemoteControlPause) { 
      [[self moviePlayer] pause]; 
     } else if (theEvent.subtype==UIEventSubtypeRemoteControlTogglePlayPause) { 
      if ([[self moviePlayer] playbackState]==MPMoviePlaybackStatePlaying) { 
       [[self moviePlayer] pause]; 
      } else { 
       [[self moviePlayer] play]; 
      } 
     } else if (theEvent.subtype==UIEventSubtypeRemoteControlStop) { 
      [[self moviePlayer] stop]; 
     } else if (theEvent.subtype==UIEventSubtypeRemoteControlNextTrack) { 
      NSTimeInterval currentTime = [[self moviePlayer] currentPlaybackTime]; 
      currentTime += 10; 
      if (currentTime>[[self moviePlayer] duration]) 
       currentTime = [[self moviePlayer] duration]; 
      [[self moviePlayer] setCurrentPlaybackTime:currentTime]; 
     } else if (theEvent.subtype==UIEventSubtypeRemoteControlPreviousTrack) { 
      NSTimeInterval currentTime = [[self moviePlayer] currentPlaybackTime]; 
      currentTime -= 10; 
      if (currentTime<0) 
       currentTime = 0; 
      [[self moviePlayer] setCurrentPlaybackTime:currentTime]; 
     } else if (theEvent.subtype==UIEventSubtypeRemoteControlBeginSeekingBackward) { 
      [[self moviePlayer] beginSeekingBackward]; 
     } else if (theEvent.subtype==UIEventSubtypeRemoteControlBeginSeekingForward) { 
      [[self moviePlayer] beginSeekingForward]; 
     } else if (theEvent.subtype==UIEventSubtypeRemoteControlEndSeekingBackward || theEvent.subtype==UIEventSubtypeRemoteControlEndSeekingForward) { 
      [[self moviePlayer] endSeeking]; 
     } 
    } 
} 
@end 


- (void)tableView:(UITableView *)theTableView didSelectRowAtIndexPath:(NSIndexPath *)theIndexPath { 
    NSString *file = [[MGMFilesPath stringByExpandingTildeInPath] stringByAppendingPathComponent:[files objectAtIndex:[theIndexPath indexAtPosition:1]]]; 

    moviePlayerView = [[MGMMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:file]]; 

    [self presentMoviePlayerViewControllerAnimated:moviePlayerView]; 
    [[moviePlayerView moviePlayer] play]; 

    [fileView deselectRowAtIndexPath:theIndexPath animated:NO]; 
} 
+0

這對我有效。節省了很多時間,我想感謝你... – 2015-07-10 03:57:45

相關問題