检测耳机按钮点击iPhone SDK

时间:2011-09-15 09:35:42

标签: iphone sdk detect headset

有没有办法检测耳机的播放/暂停按钮?

我设法使用以下方法检测音量按钮点击次数:

AudioSessionAddPropertyListener( kAudioSessionProperty_CurrentHardwareOutputVolume , audioVolumeChangeListenerCallback, self );

但我找不到中心按钮的AudioSessionProperty。有什么办法呢?

3 个答案:

答案 0 :(得分:7)

从应用程序外部完成的所有操作都被视为“远程事件”。如果您双击主页按钮并按其中的播放/暂停,则相当于按下耳机上的播放/暂停按钮(对于下一次双击,以及之前的三次敲击,相同)。

以下是event handling of remote events for iOS的指南。

就个人而言,我喜欢继承MainWindow(UIWindow)并覆盖sendEvent:方法,因此我可以更直接地管理它:

- (void)sendEvent:(UIEvent *)event
{
    if (event.type == UIEventTypeRemoteControl)
    {
        // Do stuff here
    }
    else
    {
        // Not my problem.
        [super sendEvent:event];
    }
}

希望有帮助,中央按钮事件的枚举为UIEventSubtypeRemoteControlTogglePlayPause

答案 1 :(得分:1)

尝试了以上所有方法,但遗憾的是现在似乎没有任何方法。 然后我窥视了beginReceivingRemoteControlEvents并发现了

  

在iOS 7.1和更高版本中,使用共享的MPRemoteCommandCenter对象注册远程控制事件。使用共享的命令中心对象时,无需调用此方法。

然后检出MPRemoteCommandCenter,最后进入MPRemoteCommand文档页面。

好东西是这个例子:

let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.playCommand.addTarget(handler: { (event) in    

    // Begin playing the current track    
    self.myMusicPlayer.play()
    return MPRemoteCommandHandlerStatus.success
})

现在,如果我们想阅读中间按钮,我们可以做:

MPRemoteCommandCenter.shared().togglePlayPauseCommand.addTarget { (event: MPRemoteCommandEvent) -> MPRemoteCommandHandlerStatus in

 // middle button (toggle/pause) is clicked
 print("event:", event.command)

 return .success
}

这行得通,我设法检测到了耳机的中键。

注意: 我注意到有不同的行为,具体取决于我们在上面放置此类代码的位置。 那就是当我将其放入View Controller中时,报告的事件是相同的,而当我将其放入AppDelegate的didFinishLaunching中时,所报告的事件将有所不同。无论哪种方式都可以检测到事件。

答案 2 :(得分:0)

可以回答的很好,但我认为它已经过时了。

现在你需要继承UIApplication。

main.m

的代码
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "MyUIApplication.h"

int main(int argc, char * argv[]) {
  @autoreleasepool {
    return UIApplicationMain(
      argc,
      argv,
      NSStringFromClass([MyUIApplication class]),
      NSStringFromClass([AppDelegate class]));
  }
}

MyUIApplication.m的代码:

@implementation MyUIApplication
- (void)sendEvent:(UIEvent *)event {
  if (event.type == UIEventTypeRemoteControl) {
    // Check event.subtype to see if it's a single click, double click, etc.
  } else {
    // Not my problem.
    [super sendEvent:event];
  }
}
@end

AppDelegate.m的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

致电[application beginReceivingRemoteControlEvents];