有没有办法检测耳机的播放/暂停按钮?
我设法使用以下方法检测音量按钮点击次数:
AudioSessionAddPropertyListener( kAudioSessionProperty_CurrentHardwareOutputVolume , audioVolumeChangeListenerCallback, self );
但我找不到中心按钮的AudioSessionProperty。有什么办法呢?
答案 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];