【问题标题】:How can I know users click fast forward and fast rewind buttons on the playback controls in iPhone我怎么知道用户点击了 iPhone 播放控件上的快进和快退按钮
【发布时间】:2010-08-29 05:42:40
【问题描述】:

我想实现以下的东西,

  1. 应用正在后台运行音乐或视频(使用 MPMoviePlayerController)。
  2. 用户双击主页按钮并转到显示播放控件(快退、播放或暂停、快进按钮)的第一个屏幕
  3. 用户单击快退或快进按钮。 然后应用播放上一个或下一个音乐或视频。

对于第三步,我应该知道点击了哪个按钮。 (我自然知道,当前正在播放的项目被暂停、停止……使用MPMoviePlayerPlaybackStateDidChangeNotification 通知)。

我应该注册哪个通知?或者有其他方法吗?

【问题讨论】:

  • 如何使用 MPMoviePlayerController 播放声音?

标签: ios objective-c avfoundation mpmovieplayercontroller playback


【解决方案1】:

我自己得到了答案。

那是使用 UIApplication 的 beginReceivingRemoteControlEvents。

在适当的地方(如 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;

【讨论】:

  • 这似乎不适用于运行 iPhone 4.1 设备的模拟器?是这种情况还是我做错了什么?
  • 我的设置似乎完全相同,但无法获取任何事件。
  • 请检查您是否确实成为FirstResponder。并检查其他类是否在接收称为 becomeFirstResponder 的事件的类之后调用 becomeFirstResponder。
  • 无论捕获远程控制事件是否有效,似乎都有不同的体验。单独,您能否为您的解决方案提供一个独立的示例?
  • 我得到这个来响应通过 iPhone 耳机控件的按钮点击,而不是屏幕上的按钮。有没有人幸运地捕捉到屏幕上的下一个/上一个按钮?
【解决方案2】:

这可能是一个很晚的答案,但正如我注意到的,关于音频播放和远程控制的 Q/As 并不多,所以我希望我的回答能帮助其他有同样问题的人:

我现在用的是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 中设置它。

注意! 这段代码目前运行良好,但我看到了另外两个子类型,称为UIEventSubtypeRemoteControlEndSeekingBackwardUIEventSubtypeRemoteControlEndSeekingBackward。我不确定它们是否必须实施,如果有人知道,请告诉我们。

【讨论】:

  • 你在 iOS 8 中测试过吗?因为似乎没有工作@Neeku
  • @NorthBlast 不,我一年多以前就在这方面了,但很快需要在 iOS 8 上更新和测试...
  • @NorthBlast 顺便说一句,您可能认为它不起作用,但实际上您需要长按(点击并按住一段时间)使其倒回。它不如 Apple 自己的 Podcast 应用程序那么好,但对图书馆的访问权限有限,这已经足够令人满意了。
猜你喜欢
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
相关资源
最近更新 更多