iOS 开发中监听耳机拔插、耳机线控
来源:互联网 发布:基因检测机构 知乎 编辑:程序博客网 时间:2024/05/01 12:48
iOS开发当中有关于视音频播放的开发不在少数,用户时常会使用到一种输出设备,那就是"耳机",这一篇博客写的就是关于耳机的一些开发相关的技术点.
检测耳机是否插入
看到上面的标题的时候一定要注意,这里说的是"检测耳机是否插入",这里只是一次性的检测,不是实时监控耳机的拔插,但是有一些时候,下面的这个方法已经足够满足我们的开发需求了.
首先,我们需要导入AVFoundation.framework这个框架如下图.
然后导入头文件,实现下面的方法
#import <AVFoundation/AVFoundation.h> //导入头文件
- (BOOL)isHeadsetPluggedIn { AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute]; for (AVAudioSessionPortDescription* desc in [route outputs]) { if ([[desc portType] isEqualToString:AVAudioSessionPortHeadphones]) return YES; } return NO; }
监听耳机的拔插 (iOS6.0的实现)
其实这几天一直在看网上的相关的资料,发现监听耳机拔插大多数是一些iOS6.0左右的老方法,我们就先抛砖引玉一下,先看看iOS6.0是如何监听耳机拔插事件.
首先,我们需要导入AVFoundation.framework这个框架如下图.
iOS6.0的监听耳机拔插主要是对AVAudioSession单例对象中的AudioSessionAddPropertyListener
这个 block函数的实现完成的,这个函数在耳机拔插的时候调用才会调用.这里的监听耳机拔插事件我直接写在了AppDelegate中- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
,我们看一下具体的代码实现.
#import "AppDelegate.h"#import <AVFoundation/AVFoundation.h>//导入头文件@interface AppDelegate ()<AVAudioSessionDelegate>@end
@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[AVAudioSession sharedInstance] setDelegate:self];//初始化单例设置代理 [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];//设置AVAudioSession单例对象的类型 AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange,audioRouteChangeListenerCallback, (__bridge void *)(self));//调用block函数 return YES;}//对block函数其中的方法进行实现void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueSize,const void *inPropertyValue ) { // ensure that this callback was invoked for a route change if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return; { // Determines the reason for the route change, to ensure that it is not // because of a category change.
CFDictionaryRef routeChangeDictionary = (CFDictionaryRef)inPropertyValue; CFNumberRef routeChangeReasonRef = (CFNumberRef)CFDictionaryGetValue (routeChangeDictionary, CFSTR (kAudioSession_AudioRouteChangeKey_Reason) ); SInt32 routeChangeReason; CFNumberGetValue (routeChangeReasonRef, kCFNumberSInt32Type, &routeChangeReason); if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) { //Handle Headset Unplugged NSLog(@"没有耳机!"); } else if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable) { //Handle Headset plugged in NSLog(@"有耳机!"); } }}
监听耳机的拔插 (iOS6.0之后的实现)
其实,如果不是一个有警告情结的程序猿,上面的监听耳机拔插实现已经完全能满足工作需求,但是对于我这么一个有警告情结的程序猿,心中对上面的程序运行过程出现的警告十分的反感,在上面的AVAudioSession很多方法被弃用之后,我们需要使用通知来实现监听耳机的拔插.所以就出现了下面的方法.
下面的方法我为了方便,就直接下载Demo的ViewController中,和上面一样,我们需要导入AVFoundation.framework这个框架.然后我们在ViewController导入头文件.然后我们需要监听的通知名称如下.
AVAudioSessionRouteChangeNotification //需要监听的通知名称
具体的代码实现,如下.
#import "ViewController.h"#import <AVFoundation/AVFoundation.h>@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; [[AVAudioSession sharedInstance] setActive:YES error:nil];//创建单例对象并且使其设置为活跃状态. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteChangeListenerCallback:) name:AVAudioSessionRouteChangeNotification object:nil];//设置通知}//通知方法的实现- (void)audioRouteChangeListenerCallback:(NSNotification*)notification{ NSDictionary *interuptionDict = notification.userInfo; NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue]; switch (routeChangeReason) { case AVAudioSessionRouteChangeReasonNewDeviceAvailable: NSLog(@"AVAudioSessionRouteChangeReasonNewDeviceAvailable"); tipWithMessage(@"耳机插入"); break; case AVAudioSessionRouteChangeReasonOldDeviceUnavailable: NSLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable"); tipWithMessage(@"耳机拔出,停止播放操作"); break; case AVAudioSessionRouteChangeReasonCategoryChange: // called at start - also when other audio wants to play tipWithMessage(@"AVAudioSessionRouteChangeReasonCategoryChange"); break; }}//不管何时,只要有通知中心的出现,在dealloc的方法中都要移除所有观察者.-(void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self];}//自定提醒窗口NS_INLINE void tipWithMessage(NSString *message){ dispatch_async(dispatch_get_main_queue(), ^{ UIAlertView *alerView = [[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil]; [alerView show]; [alerView performSelector:@selector(dismissWithClickedButtonIndex:animated:) withObject:@[@0, @1] afterDelay:0.9]; });}
监听耳机的拔插的注意事项(必看部分)
1.开发人员测试监听耳机的拔插的代码的时候,要使用真机测试.模拟器是没有耳机插孔的,除非你给电脑凿一个孔.
0 0
- iOS 开发中监听耳机拔插、耳机线控
- iOS 监听耳机插拔
- iOS开发之音乐播放----监听耳机拔插
- iOS 开发中 捕获耳机插拔事件
- 监听耳机拔插状态
- android 监听耳机插拔
- Android 耳机按键与拔插监听
- wangchenfeng android 监听耳机插拔
- android耳机插拔的监听
- ios监听输出设备变化(监听耳机插拔,蓝牙设备连接断开等)的实现
- iOS监听耳机插拔的不使用系统通知实现的一种方式
- 耳机插拔流程
- 耳机插拔流程
- [RK3288][Android6.0] 有线耳机插拔事件监听小结
- Android 多媒体控制 来电监听-耳机插拔监听-耳机按钮监听-MediaSession-MediaStyle
- iOS开发:耳机线控
- Android如何监听蓝牙耳机和有线耳机的插拔
- android耳机插拔事件
- NanoPC-T2 Uboot启动过程分析 - 3-1 main_loop()初认识
- iOS SVProgressHUD 用法
- FS_S5PC100平台上Linux Camera驱动开发详解(一)
- cocos2dx安卓项目如何引用外部.so文件
- iOS MD5 base 64 加密
- iOS 开发中监听耳机拔插、耳机线控
- NanoPC-T2 Uboot启动过程分析 - 3-2 启动命令的执行
- 图片切换的效果
- WEB打印的几种方案
- 欢迎使用CSDN-markdown编辑器
- c++中union的使用,看高手们如何解释的
- Solr基础知识
- hdu5774(2016多校第四场,水题)
- 流媒体ts格式解析