关于ios 的耳机线线控
如题
线控主要就是指的用ios耳机的 中间那个键来自定义一些程序自己的事件(比如玩吃鸡的时候,作为开枪扳机)
而想要控制耳机的音量加减的事件,
有一种方法,就是监听 系统音量的变化,根据音量变化来触发不同的行为。但是这种有局限性,比如音量最大后你再按音量加,音量就不会变了。
推荐一篇博客
链接是 https://www.jianshu.com/p/950fec0cdb21
为防止作者删掉博客,内容一并显示如下:
关于监控苹果耳机,目的上主要分为监控耳机插入,拔出,和耳机线控,因为最近做了关于苹果耳机线控方面的需求,所以想针对苹果耳机线控在这唠嗑一下。

苹果耳机3个按键(音量加,音量减,中间功能键)的经典设计已经延续了十几年,功能上我们谈到的耳机线控是监听耳机中间功能键的动作,作出功能上的响应。
如何支持耳机线控
1.引入AVFoundation框架
具体引入方式不截图,不细说了,只有引入了AVFoundation框架,耳机线控才能生效。
2.允许传递远程控制事件
允许传递远程控制事件
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
结束传递远程控制事件
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
因为在允许接受远程控制事件时,UI控件必须为第一响应者,所以需要在beginReceivingRemoteControlEvents方法后面增加一个becomeFirstResponder方法。
记得补上
-(BOOL)canBecomeFirstResponder{
return YES;
}
3.启用远程事件接收
启动远程事件接受的应用才能支持耳机线控,当然也可以监控其他外部控件的响应,比如自拍杆拍照之类的。
启用远程事件接收的核心就是UIResponder类中的- (void)remoteControlReceivedWithEvent:(UIEvent *)event方法。
//received remote event
-(void)remoteControlReceivedWithEvent:(UIEvent *)event{
NSLog(@"event tyipe:::%ld subtype:::%ld",(long)event.type,(long)event.subtype);
//type==2 subtype==单击暂停键:103,双击暂停键104
if (event.type == UIEventTypeRemoteControl) {
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:{
NSLog(@"play---------");
}break;
case UIEventSubtypeRemoteControlPause:{
NSLog(@"Pause---------");
}break;
case UIEventSubtypeRemoteControlStop:{
NSLog(@"Stop---------");
}break;
case UIEventSubtypeRemoteControlTogglePlayPause:{
//单击暂停键:103
NSLog(@"单击暂停键:103");
}break;
case UIEventSubtypeRemoteControlNextTrack:{
//双击暂停键:104
NSLog(@"双击暂停键:104");
}break;
case UIEventSubtypeRemoteControlPreviousTrack:{
NSLog(@"三击暂停键:105");
}break;
case UIEventSubtypeRemoteControlBeginSeekingForward:{
NSLog(@"单击,再按下不放:108");
}break;
case UIEventSubtypeRemoteControlEndSeekingForward:{
NSLog(@"单击,再按下不放,松开时:109");
}break;
default:
break;
}
}
}
为了保证应用一定能够接受到远程控制请求,包括耳机线控,
beginReceivingRemoteControlEvents方法和remoteControlReceivedWithEvent方法建议写在应用的启动的入口,AppDelegate或者RootViewController中。
写到这里,理论上我们就可以疯狂的点击耳机功能键,监控耳机响应各种华丽的操作了,但在一顿猛烈的点击之后,日志板上一片风平浪静,我的预想并没有达到。。。
实现耳机线控的三个前提
整理一下思绪,实现耳机线控的按键的监控是有以下三个前提
1.启用远程事件接收(使用[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];方法)。
2.对于UI控件同样要求必须是第一响应者(对于视图控制器UIViewController或者应用程序UIApplication对象监听无此要求)。
3.应用程序必须是当前音频的控制者,也就是在系统控制中心中当前音频播放程序必须是我们自己开发程序。
第一第二点比较好理解,第三点是何解?师爷。翻译翻译。
下拉我的手机,控制中心中有一个音乐快捷播放器。
如图所示,我的控制中心的音乐播放器被 米津玄师的Lemon 霸占着。。
第三点是指只有应用霸占着控制中心的音乐播放器时,才可以实现耳机的线控。此时我的应用明显没有具备这个条件。
如何获取播放器的控制权
既然已经知道了问题的原因,那我们就需要对症下药了。
为了获取控制中心播放器的控制权,我决定在应用开启的时候使用AVAudioPlayer播放一段几秒中的空白音频,此处是我随便写的一个demo,具体播放空白音频的时机各位开发者可以视情况而定,比如如果是用耳机线控做相机功能的朋友,可以选择在打开相机的时候使用AVAudioPlayer播放空白音频,获取播放器权限。
AVAudioPlayer的使用我就不细说了,直接上代码。 [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"20" ofType:@"mp3"];
NSURL *url = [NSURL fileURLWithPath:filePath];
self.player = [[AVAudioPlayer alloc] initWithContentsOfURL:url fileTypeHint:nil error:nil];
if ([self.player prepareToPlay]) {
NSLog(@"音频文件准备就绪");
}
[self.player play];
Class playingInfoCenter = NSClassFromString(@"MPNowPlayingInfoCenter");
if (playingInfoCenter) {
NSMutableDictionary *songInfo = [NSMutableDictionary dictionary];
//歌曲名称
[songInfo setObject:@"呜啦呜啦" forKey:MPMediaItemPropertyTitle];
//演唱者
[songInfo setObject:@"JOJO" forKey:MPMediaItemPropertyArtist];
[songInfo setObject:[[MPMediaItemArtwork alloc] initWithImage:[UIImage imageNamed:@"MP.png"]] forKey:MPMediaItemPropertyArtwork];
[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo];
}
为了证明确实获取了控制中心音乐播放器权限,使用MPNowPlayingInfoCenter设置播放器信息。
成功获取播放器权限后,我再次对我的耳机一整狂点,remoteControlReceivedWithEvent方法执行成功,nice~
总结
本次做耳机线控踩的坑主要是第三点前提
应用程序必须是当前音频的控制者,也就是在系统控制中心中当前音频播放程序必须是我们自己开发程序。
这点不太理解,花费了一天多的时间求索。所幸最后成功了,但解决问题的方法个人感觉并不是很聪明,如果有更好办法的朋友欢迎留言指教。
参考博客:
聊聊iOS开发中耳机的那点事(监听耳机拔插、耳机线控)
关于MPNowPlayingInfoCenter和MPRemoteCommandCenter
关于ios 的耳机线线控的更多相关文章
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...
- 转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一 ...
- iOS 耳机线控
当你使用iphone的时候听音乐的时候,播放器在后台运行的时候,你仍然可以通过耳机来进行操作,完成曲目切换,快进,快退等功能!当然你的程序不一定是播放器应用,但是我们仍然可以让它具有这个功能,让用户通 ...
- iOS-触摸事件、手势识别、摇晃事件、耳机线控
概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件. ...
- iphone 耳机 线控
有电话呼入时: 按一次接听电话: 快速按两次将电话转到语音信箱: 通话中: 按一次挂断电话: 通话中如果有第二个电话打进来时: 按一次保留当前通话并接听第二个电话: 按住两秒钟不放忽略(拒绝接听)第二 ...
- Unity3d IOS中的IGUI控件
Unity3d IOS中的IGUI控件 @灰太龙 群63438968 我讲一下IOS中用的UI,我们采用IGUI,需要使用IGUI的高版本,在Unity3d 4.2中也可以使用的! 之前IGUI有个 ...
- 红米1S Mokee4.4.4 本人编译版耳机线控改动调音量以及上下曲方法
改动的文件为,用Re管理器编辑: system/usr/keylayout/msm8226-tapan-snd-card_Button_Jack.kl 默认的耳机线控的上下键是切换上下曲功能,因此此文 ...
- Xamarin iOS教程之页面控件
Xamarin iOS教程之页面控件 Xamarin iOS 页面控件 在iPhone手机的主界面中,经常会看到一排小白点,那就是页面控件,如图2.44所示.它是由小白点和滚动视图组成,可以用来控制翻 ...
- iOS学习之UIPickerView控件的关联选择
接上篇iOS学习之UIPickerView控件的简单使用 接着上篇的代码 http://download.csdn.net/detail/totogo2010/4391870 ,我们要实现的效果如下: ...
随机推荐
- 【Java架构:基础技术】一篇文章搞掂:Idea
一.使用技巧 1.1.配置Maven 打开File-Settings打开设置界面 1.2.配置JDK JDK可以设置默认版本,也可以设置针对某个项目 分别对应File-Other Setting-De ...
- QTP学习笔记1
1.将变量值写入datatable/ 从datatable中取值赋给变量 DataTable("列名","sheet名") = 变量名 变量名 = DataTa ...
- 有关JWT(Json Web Token)的那些事
用户认证是计算机安全领域一个永恒的热点话题,然而你会发现,开发者很少讨论有关Json Web Token的话题,其实使用Json Web Token集成到API身份验证机制中是容易,本文给大家普及基础 ...
- Python基础-main
Python基础-_main_ 写在前面 如非特别说明,下文均基于Python3 一.__main__的官方解释 参考 _main_ -- Top-level script environment ' ...
- (5)C++ 循环和判断
循环 一.for循环 ; i < ; i++) { cout << "abc"<< endl; } 或 ; i; i--) { cout <&l ...
- Git命令操作
安装配置 将其bin目录添加到path ssh -keygen -t rsa -C 自己的邮箱(获取ssh远程连接秘钥) 使用: 进入项目目录 右击进入git bash 执行git init gith ...
- 在使用 Eclisp 生成 实体(sql Server) 出现错误 :Unable to locate JAR/zip in file system as specified by the driver definition: sqljdbc.jar.
错误: 解决方法: 第一步:点击 JAR List 第二步: 点击 Remove JAR/ZIP 第三步: 再添加一下 sqljdbc.jar
- QT5.2 Assistant-设置应用程序图标
在Qt助手(assistant.exe)搜索关键字"Setting the Application Icon"就可以看到在各种平台设置Qt程序图标的方法,包括QT支持的Win ...
- SQL必知必会——思维导图
Xmind实在太坑了,竟然不能导出高清图片,我回来折腾个PS整一下!
- Draggable(拖动框)
一.class加载方式 <div id="box" class="easyui-draggable" style="width:400px;he ...