关于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 ,我们要实现的效果如下: ...
随机推荐
- html{-webkit-text-size-adjust:none;}(取消浏览器最小字体限制)
2016年10月13日 09:31:58 ITzhongzi 阅读数 9409 1.当样式表里font-size<12px时,中文版chrome浏览器里字体显示仍为12px,这时可以用 ht ...
- 使用Guzzle执行HTTP请求
Guzzle是一个PHP的HTTP客户端,用来轻而易举地发送请求,并集成到我们的WEB服务上.Guzzle提供了简单的接口,构建查询语句.POST请求.分流上传下载大文件.使用HTTP cookies ...
- HTML-参考手册: HTML ISO-8859-1
ylbtech-HTML-参考手册: HTML ISO-8859-1 1.返回顶部 1. HTML ISO-8859-1 参考手册 现代的浏览器支持的字符集: ASCII 字符集 标准 ISO 字符集 ...
- 常用numpy和pandas
常用库 1.NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准数学 ...
- python_面向对象,类名称空间,对象名称空间,组合
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量(字段) 动态属性就是定义在类中的方法 其中类 ...
- 好947 Mybatis 配置resultMap 带參数查询Map 注意selectOne数据库返回结果一条数据库 否则会报错
//TMD 写几个demo 还有大站採集 <a target=_blank href="http://hao947.com/" target="_blank&quo ...
- application/json和application/x-www-form-urlencoded参数接收
application/json ajax请求中content-type:application/json代表参数以json字符串传递给后台,controller接收需要@RequestBody 接收 ...
- ionic2(3) 密码键盘组件 ionic2-pincode-input 使用
1.效果展示: 2.安装: npm install ionic2-pincode-input --save 3.app.module.ts配置 app.module.ts import { NgMod ...
- Apache Shiro反序列化远程代码执行
一.漏洞利用 wget https://raw.githubusercontent.com/sv3nbeast/ShiroScan/master/moule/ysoserial.jar 反弹shell ...
- Linux设置chrome缓存至内存,及开关机同步
默认chrome缓存位置在~/.cache/google-chrome中,磁盘io很多.为减少磁盘io,保护磁盘同时加快chrome速度,可设置缓存使用内存盘,缺点是重启后缓存丢失,所以这里可以使用脚 ...