iOS扬声器和听筒模式的切换以及距离传感器红外感应的设置
2016-09-02 10:56
405 查看
#import "MyAudioManager.h"
#import <AVFoundation/AVFoundation.h>
#import "NSStringEx.h"
@interface
MyAudioManager()<AVAudioPlayerDelegate>
@property (nonatomic,
strong) AVAudioSession *session;
@property (nonatomic,
strong) AVAudioPlayer *player;
@property (nonatomic,
strong) AVAudioRecorder *recorder;
@property (nonatomic,
strong) NSURL *recordFileURL;
@property (nonatomic,
copy) NSString *recordUrlKey;
@property (nonatomic,
copy) didPlayFinish finishBlock;
@end
@implementation MyAudioManager
+ (instancetype)sharedInstance
{
static
MyAudioManager *_sharedInstance =
nil;
static
dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self
alloc ] init];
[_sharedInstance setproximity];
});
return _sharedInstance;
}
#pragma mark --设置距离传感器
- (void)setproximity{
self.session = [AVAudioSession
sharedInstance];
NSError *sessionError =
nil;
UInt32 audioRouteOverride =
kAudioSessionOverrideAudioRoute_Speaker;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
AudioSessionSetProperty (
kAudioSessionProperty_OverrideAudioRoute,
sizeof (audioRouteOverride),
&audioRouteOverride
);
UInt32 sessionCategory =
kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
//默认情况下扬声器播放
[self.session
setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker
error:&sessionError];
[self.session
overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&sessionError];
if(!self.session) {
TDDLogEvent(@"Error creating session: %@", [sessionError
description]);
}
else {
[self.session
setActive:YES
error:nil];
}
}
//proximityState 属性
如果用户接近手机,此时属性值为YES,并且屏幕关闭(非休眠)。
-(void)sensorStateChange:(NSNotificationCenter *)notification{
if ([[UIDevice
currentDevice] proximityState] ==
YES)
{
//NSLog(@"Device is close to user");
[self.session
setCategory:AVAudioSessionCategoryPlayAndRecord
error:nil];
}
else
{
// NSLog(@"Device is not close to user");
[self.session
setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker
error:nil];
[self.session
overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:nil];
}
}
- (void)playWithData:(NSData *)data finish:(void (^)())didFinish;
{
NSLog(@"datat========%@",data);
self.finishBlock = didFinish;
if (self.player) {
if (self.player.isPlaying)
{
[self
handleNotification:NO];
[self.player
stop];
}
self.player.delegate =
nil;
self.player =
nil;
}
NSError *playerError =
nil;
self.player = [[AVAudioPlayer
alloc] initWithData:data
error:&playerError];
if (self.player) {
self.player.delegate =
self;
[self
handleNotification:YES];
[self.player
play];
}
else {
TDDLogEvent(@"Error creating player: %@", [playerError
description]);
}
}
#pragma mark - 监听听筒or扬声器
- (void) handleNotification:(BOOL)state
{
[[UIDevice
currentDevice] setProximityMonitoringEnabled:state];
//建议在播放之前设置yes,播放结束设置NO,这个功能是开启红外感应
if(state)//添加监听
{
[[NSNotificationCenter
defaultCenter] addObserver:self
selector:@selector(sensorStateChange:)
name:@"UIDeviceProximityStateDidChangeNotification"
object:nil];
}
else//移除监听
{
[[NSNotificationCenter
defaultCenter]
removeObserver:self
name:@"UIDeviceProximityStateDidChangeNotification"
object:nil];
}
}
- (void)stopPlay{
if (self.player) {
if (self.player.isPlaying)
{
[self
handleNotification:NO];
[self.player
stop];
}
self.player.delegate =
nil;
self.player =
nil;
[[NSNotificationCenter
defaultCenter] postNotificationName:@"audioCellStopAnimating"
object:nil];
}
}
- (BOOL)initRecord{
//录音设置
NSMutableDictionary *recordSetting = [[NSMutableDictionary
alloc]init];
//设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM
[recordSetting setValue:[NSNumber
numberWithInt:kAudioFormatMPEG4AAC]
forKey:AVFormatIDKey];
//设置录音采样率(Hz)
如:AVSampleRateKey==8000/44100/96000(影响音频的质量)
[recordSetting setValue:[NSNumber
numberWithFloat:44100]
forKey:AVSampleRateKey];
//录音通道数 1
或 2
[recordSetting setValue:[NSNumber
numberWithInt:1]
forKey:AVNumberOfChannelsKey];
//线性采样位数 8、16、24、32
[recordSetting setValue:[NSNumber
numberWithInt:16]
forKey:AVLinearPCMBitDepthKey];
//录音的质量
[recordSetting setValue:[NSNumber
numberWithInt:AVAudioQualityHigh]
forKey:AVEncoderAudioQualityKey];
NSString *strUrl = [NSString
stringWithFormat:@"%@/%@.mp4", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) lastObject], [NSString
uuid]];
NSURL *url = [NSURL
fileURLWithPath:strUrl];
self.recordUrlKey = strUrl;
// self.audioRecord.filePath = strUrl;
NSError *error;
//初始化
_recorder = [[AVAudioRecorder
alloc]initWithURL:url
settings:recordSetting
error:&error];
//开启音量检测
self.recorder.meteringEnabled
= YES;
if ([self.recorder
prepareToRecord]){
return
YES;
}
return
NO;
}
- (BOOL)startRecord
{
return [self.recorder
record];
}
- (void)stopRecordWithBlock:(didRecordFinish)block
{
NSTimeInterval duration =
self.recorder.currentTime;
[self.recorder
stop];
if (block) {
block(self.recordUrlKey, (NSInteger)(round(duration)));
}
}
- (CGFloat)peakPowerMeter{
[self.recorder
updateMeters];
double peakPower =
pow(10, (0.05* [self.recorder
peakPowerForChannel:0]));
return peakPower;
}
- (NSInteger)recordTime{
return
self.recorder.currentTime+0.5;
}
#pragma mark - AVAudioPlayerDelegate
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
if (self.finishBlock) {
self.finishBlock();
[self
handleNotification:NO];
}
}
@end
#import <AVFoundation/AVFoundation.h>
#import "NSStringEx.h"
@interface
MyAudioManager()<AVAudioPlayerDelegate>
@property (nonatomic,
strong) AVAudioSession *session;
@property (nonatomic,
strong) AVAudioPlayer *player;
@property (nonatomic,
strong) AVAudioRecorder *recorder;
@property (nonatomic,
strong) NSURL *recordFileURL;
@property (nonatomic,
copy) NSString *recordUrlKey;
@property (nonatomic,
copy) didPlayFinish finishBlock;
@end
@implementation MyAudioManager
+ (instancetype)sharedInstance
{
static
MyAudioManager *_sharedInstance =
nil;
static
dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self
alloc ] init];
[_sharedInstance setproximity];
});
return _sharedInstance;
}
#pragma mark --设置距离传感器
- (void)setproximity{
self.session = [AVAudioSession
sharedInstance];
NSError *sessionError =
nil;
UInt32 audioRouteOverride =
kAudioSessionOverrideAudioRoute_Speaker;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
AudioSessionSetProperty (
kAudioSessionProperty_OverrideAudioRoute,
sizeof (audioRouteOverride),
&audioRouteOverride
);
UInt32 sessionCategory =
kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,
sizeof(sessionCategory),
&sessionCategory);
//默认情况下扬声器播放
[self.session
setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker
error:&sessionError];
[self.session
overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&sessionError];
if(!self.session) {
TDDLogEvent(@"Error creating session: %@", [sessionError
description]);
}
else {
[self.session
setActive:YES
error:nil];
}
}
//proximityState 属性
如果用户接近手机,此时属性值为YES,并且屏幕关闭(非休眠)。
-(void)sensorStateChange:(NSNotificationCenter *)notification{
if ([[UIDevice
currentDevice] proximityState] ==
YES)
{
//NSLog(@"Device is close to user");
[self.session
setCategory:AVAudioSessionCategoryPlayAndRecord
error:nil];
}
else
{
// NSLog(@"Device is not close to user");
[self.session
setCategory:AVAudioSessionCategoryPlayAndRecord
withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker
error:nil];
[self.session
overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:nil];
}
}
- (void)playWithData:(NSData *)data finish:(void (^)())didFinish;
{
NSLog(@"datat========%@",data);
self.finishBlock = didFinish;
if (self.player) {
if (self.player.isPlaying)
{
[self
handleNotification:NO];
[self.player
stop];
}
self.player.delegate =
nil;
self.player =
nil;
}
NSError *playerError =
nil;
self.player = [[AVAudioPlayer
alloc] initWithData:data
error:&playerError];
if (self.player) {
self.player.delegate =
self;
[self
handleNotification:YES];
[self.player
play];
}
else {
TDDLogEvent(@"Error creating player: %@", [playerError
description]);
}
}
#pragma mark - 监听听筒or扬声器
- (void) handleNotification:(BOOL)state
{
[[UIDevice
currentDevice] setProximityMonitoringEnabled:state];
//建议在播放之前设置yes,播放结束设置NO,这个功能是开启红外感应
if(state)//添加监听
{
[[NSNotificationCenter
defaultCenter] addObserver:self
selector:@selector(sensorStateChange:)
name:@"UIDeviceProximityStateDidChangeNotification"
object:nil];
}
else//移除监听
{
[[NSNotificationCenter
defaultCenter]
removeObserver:self
name:@"UIDeviceProximityStateDidChangeNotification"
object:nil];
}
}
- (void)stopPlay{
if (self.player) {
if (self.player.isPlaying)
{
[self
handleNotification:NO];
[self.player
stop];
}
self.player.delegate =
nil;
self.player =
nil;
[[NSNotificationCenter
defaultCenter] postNotificationName:@"audioCellStopAnimating"
object:nil];
}
}
- (BOOL)initRecord{
//录音设置
NSMutableDictionary *recordSetting = [[NSMutableDictionary
alloc]init];
//设置录音格式 AVFormatIDKey==kAudioFormatLinearPCM
[recordSetting setValue:[NSNumber
numberWithInt:kAudioFormatMPEG4AAC]
forKey:AVFormatIDKey];
//设置录音采样率(Hz)
如:AVSampleRateKey==8000/44100/96000(影响音频的质量)
[recordSetting setValue:[NSNumber
numberWithFloat:44100]
forKey:AVSampleRateKey];
//录音通道数 1
或 2
[recordSetting setValue:[NSNumber
numberWithInt:1]
forKey:AVNumberOfChannelsKey];
//线性采样位数 8、16、24、32
[recordSetting setValue:[NSNumber
numberWithInt:16]
forKey:AVLinearPCMBitDepthKey];
//录音的质量
[recordSetting setValue:[NSNumber
numberWithInt:AVAudioQualityHigh]
forKey:AVEncoderAudioQualityKey];
NSString *strUrl = [NSString
stringWithFormat:@"%@/%@.mp4", [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES) lastObject], [NSString
uuid]];
NSURL *url = [NSURL
fileURLWithPath:strUrl];
self.recordUrlKey = strUrl;
// self.audioRecord.filePath = strUrl;
NSError *error;
//初始化
_recorder = [[AVAudioRecorder
alloc]initWithURL:url
settings:recordSetting
error:&error];
//开启音量检测
self.recorder.meteringEnabled
= YES;
if ([self.recorder
prepareToRecord]){
return
YES;
}
return
NO;
}
- (BOOL)startRecord
{
return [self.recorder
record];
}
- (void)stopRecordWithBlock:(didRecordFinish)block
{
NSTimeInterval duration =
self.recorder.currentTime;
[self.recorder
stop];
if (block) {
block(self.recordUrlKey, (NSInteger)(round(duration)));
}
}
- (CGFloat)peakPowerMeter{
[self.recorder
updateMeters];
double peakPower =
pow(10, (0.05* [self.recorder
peakPowerForChannel:0]));
return peakPower;
}
- (NSInteger)recordTime{
return
self.recorder.currentTime+0.5;
}
#pragma mark - AVAudioPlayerDelegate
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
if (self.finishBlock) {
self.finishBlock();
[self
handleNotification:NO];
}
}
@end
相关文章推荐
- 个人信息安全报告发布:有 APP 每分钟调用位置权限 1468 次
- 下载量超过一亿的流行应用被发现含有恶意模块
- 苹果与Siri的七年之痒:“宫斗”戏码不断上演
- APP添加CNZZ统计插件教程 Android版添加phonegap
- Android studio编写简单的手电筒APP
- Android APP与媒体存储服务的交互
- java实现收藏名言语句台词的app
- 修改Android App样式风格的方法
- Android App数据格式Json解析方法和常见问题
- iOS开发之路--微博“更多”页面
- 微信APP支付Java代码
- 通过Html网页调用本地安卓(android)app程序代码
- 百度地图API提示230 错误app scode码校验失败的解决办法
- js判断移动端是否安装某款app的多种方法
- PHP实现批量生成App各种尺寸Logo
- Could not load file or assembly "App_Licenses.dll"的问题
- 手机Web APP如何实现分享多平台功能
- Android桌面插件App Widget用法分析
- Android桌面组件App Widget用法入门教程