0

キーボードからのコントロールがアプリで機能するようにしたいと考えています。コントロールは、Apple の Remote Control イベント ( beginReceivingRemoteControlEventsendReceivingRemoteControlEvents、およびremoteControlReceivedWithEvent) を使用します。ただし、これを機能させることができないようですMPMoviePlayerController

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

上記のコードでわかるように、それがファーストレスポンダーであることを確認したので、ファーストレスポンダーの問題ではないことがわかりました。

誰かがこれを機能させるのを手伝ってくれますか?

ありがとう

4

1 に答える 1

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];
}
于 2012-08-11T15:38:52.923 に答える