废话不多说说一下现状

网上好多关于扬声器的操作,可是问题多多。SDK7.X 和SDK7.X以上版本号有点诧异

#import <Foundation/Foundation.h>

#import <AudioToolbox/AudioToolbox.h>

#import <AVFoundation/AVFoundation.h>

@interface AudioManager : NSObject

{

AVAudioPlayer *m_audioPlayer;

}

@property (atomic, readonly)BOOL _isSpeakerOn;

@property (atomic, readonly)BOOL _isHeadsetOn;

+(AudioManager*)shared;

// 打开扬声器

- (void)setSpeakerOn;

// 关闭扬声器

- (void)setSpeakerOff;

@end

//

//  AudioManager.m

//  AvconNetAndCallDemo

//

//  Created by zjq on 14-7-21.

//  Copyright (c) 2014年 zjq. All rights reserved.

//

#import "AudioManager.h"

#import <UIKit/UIKit.h>

#define IOSVersion [[UIDevice currentDevice].systemVersion floatValue]

@implementation AudioManager

@synthesize _isSpeakerOn;

@synthesize _isHeadsetOn;

- (id)init

{

self = [super init];

if (self) {

_isSpeakerOn = NO;

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

//默认情况下扬声器播放

[audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers  error:nil];

[audioSession setActive:YES error:nil];

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;

AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,

sizeof(sessionCategory),

&sessionCategory);

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,

sizeof (audioRouteOverride),

&audioRouteOverride);

AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange,

audioRouteChangeListenerCallback, (__bridge void *)(self));

}

return self;

}

static AudioManager *_audioManager = NULL;

+(AudioManager*)shared

{

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

_audioManager = [[AudioManager alloc] init];

});

return _audioManager;

}

- (void)setSpeakerOn

{

NSLog(@"setSpeakerOn:%d",[NSThread isMainThread]);

UInt32 doChangeDefaultRoute = kAudioSessionOverrideAudioRoute_Speaker;

AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,

sizeof (doChangeDefaultRoute),

&doChangeDefaultRoute

);

_isSpeakerOn = [self checkSpeakerOn];

_isHeadsetOn = NO;

//[self resetOutputTarget];

}

- (void)setSpeakerOff

{

UInt32 doChangeDefaultRoute = kAudioSessionOverrideAudioRoute_None;

AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,

sizeof (doChangeDefaultRoute),

&doChangeDefaultRoute

);

_isSpeakerOn = [self checkSpeakerOn];

}

- (BOOL)checkSpeakerOn

{

CFStringRef route;

UInt32 propertySize = sizeof(CFStringRef);

AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &route);

if((route == NULL) || (CFStringGetLength(route) == 0))

{

// Silent Mode

NSLog(@"AudioRoute: SILENT, do nothing!");

}

else

{

NSString* routeStr = (__bridge NSString*)route;

NSRange speakerRange = [routeStr rangeOfString : @"Speaker"];

if (speakerRange.location != NSNotFound)

return YES;

}

return NO;

}

- (BOOL)hasHeadset

{

CFStringRef route;

UInt32 propertySize = sizeof(CFStringRef);

AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &route);

if((route == NULL) || (CFStringGetLength(route) == 0))

{

// Silent Mode

NSLog(@"AudioRoute: SILENT, do nothing!");

}

else

{

NSString* routeStr = (__bridge NSString*)route;

NSLog(@"AudioRoute: %@", routeStr);

if ([routeStr isEqualToString:@"ReceiverAndMicrophone"]) {

//            static dispatch_once_t onceToken;

//            dispatch_once(&onceToken, ^{

//                [self setSpeakerOn];

//            });

[self setSpeakerOn];

}

NSRange headphoneRange = [routeStr rangeOfString : @"Headphone"];

NSRange headsetRange = [routeStr rangeOfString : @"Headset"];

if (headphoneRange.location != NSNotFound)

{

return YES;

} else if(headsetRange.location != NSNotFound)

{

return YES;

}

}

return NO;

}

// 推断麦克风是否实用

- (BOOL)hasMicphone

{

return [[AVAudioSession sharedInstance] isInputAvailable];

}

- (void)erjiOutPutTarget

{

BOOL hasHeadset = [self hasHeadset];

if (hasHeadset) {

_isHeadsetOn = YES;

}

NSLog (@"Will Set output target is_headset = %@ .", hasHeadset?@"YES":@"NO");

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;

AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

}

- (void)resetOutputTarget

{

BOOL hasHeadset = [self hasHeadset];

NSLog (@"Will Set output target is_headset = %@ .", hasHeadset?@"YES":@"NO");

UInt32 audioRouteOverride =  kAudioSessionOverrideAudioRoute_Speaker;

AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

_isHeadsetOn = NO;

}

void audioRouteChangeListenerCallback (void *inUserData, AudioSessionPropertyID inPropertyID, UInt32 inPropertyValueS, const void *inPropertyValue)

{

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);

NSLog(@"<<<RouteChangeReason: %d",(int)routeChangeReason);

NSLog(@"[=======%@",inUserData);

AudioManager *pMgr = (__bridge AudioManager *)inUserData;

//没有耳机

if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable)

{

[pMgr setSpeakerOn];

[pMgr resetOutputTarget];

}

else if (routeChangeReason == kAudioSessionRouteChangeReason_NewDeviceAvailable)

{

[pMgr erjiOutPutTarget];

}else if (routeChangeReason == kAudioSessionRouteChangeReason_Override){

[pMgr setSpeakerOn];

[pMgr resetOutputTarget];

}

NSLog(@"-------->%f",IOSVersion);

//if (IOSVersion >= 8.0) {

if (routeChangeReason==8) {

[pMgr hasHeadset];

}

//}

}

//- (BOOL)isAirplayActived

//{

//    CFDictionaryRef currentRouteDescriptionDictionary = nil;

//    UInt32 dataSize = sizeof(currentRouteDescriptionDictionary);

//    AudioSessionGetProperty(kAudioSessionProperty_AudioRouteDescription, &dataSize, &currentRouteDescriptionDictionary);

//

//    BOOL airplayActived = NO;

//    if (currentRouteDescriptionDictionary)

//    {

//        CFArrayRef outputs = CFDictionaryGetValue(currentRouteDescriptionDictionary, kAudioSession_AudioRouteKey_Outputs);

//        if(outputs != NULL && CFArrayGetCount(outputs) > 0)

//        {

//            CFDictionaryRef currentOutput = CFArrayGetValueAtIndex(outputs, 0);

//            //Get the output type (will show airplay / hdmi etc

//            CFStringRef outputType = CFDictionaryGetValue(currentOutput, kAudioSession_AudioRouteKey_Type);

//

//            airplayActived = (CFStringCompare(outputType, kAudioSessionOutputRoute_AirPlay, 0) == kCFCompareEqualTo);

//        }

//        CFRelease(currentRouteDescriptionDictionary);

//    }

//    return airplayActived;

//}

/*

- (void)openloudspeaker{

//初始化播放器的时候例如以下设置

UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;

AudioSessionSetProperty(kAudioSessionProperty_AudioCategory,

sizeof(sessionCategory),

&sessionCategory);

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,

sizeof (audioRouteOverride),

&audioRouteOverride);

AVAudioSession *audioSession = [AVAudioSession sharedInstance];

//默认情况下扬声器播放

[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];

[audioSession setActive:YES error:nil];

[self handleNotification:YES];

}

#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)sensorStateChange:(NSNotificationCenter *)notification;

{

//假设此时手机靠近面部放在耳朵旁,那么声音将通过听筒输出,并将屏幕变暗(省电啊)

if ([[UIDevice currentDevice] proximityState] == YES)

{

NSLog(@"Device is close to user");

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:nil];

}

else

{

NSLog(@"Device is not close to user");

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

}

}

*/

@end

iOS 打开扬声器以及插入耳机的操作相关推荐

  1. python打开word并插入图片_Python操作word文档插入图片和表格的实例演示

    前言 图片是Word的一种特殊内容,这篇文章主要介绍了关于Python操作word文档,向里面插入图片和表格的相关内容,下面话不多说了,来一起看看详细的代码 实例代码: # -*- coding: U ...

  2. 笔记本电脑插入耳机不能自动切换播放设备,小键盘不能自动打开,蓝屏问题记录

    解决电脑奇葩问题记录 前言 插入耳机不能自动切换设备 小键盘开机不自动打开 小键盘开机不自动打开 总结 前言 博主电脑型号神舟战神K660E-i7 D2,系统是Windows 7,不同版本驱动来源于神 ...

  3. android连接耳机时音量控制,android – 扬声器音量(闹钟)在插入耳机时会降低

    我正试图通过最大音量的警报通道通过扬声器发出警报声.为此,我正在使用AudioManager和MediaPlayer.如果我插入耳机,仍然会通过扬声器播放闹钟,但是通过扬声器播放的闹钟音量会急剧下降, ...

  4. android插入耳机状态使用扬声器外放音乐

    原文地址 插入耳机的时候也可以选择使用扬声器播放音乐,来电铃声就是这么用的.但是只能用MediaPlayer,播放音频文件. 使用AudioTrack.write播放是行不通的.按理说AudioRec ...

  5. 电脑扬声器插入耳机后才能用怎么回事?

    笔记本小喇叭有个白色叉号,显示未安装音频设备,也找不到扬声器.设备管理器显示seanry audio有问题,seanry audio图标上有个黄色感叹号,卸载后重启也还是显示有问题,但插入耳机后就正常 ...

  6. 解决Win7系统插入耳机或音响没有声音教程

    核心提示:我刚刚重装了系统,硬件应该是没有问题的,win7系统插入耳机或音响为什么没有声音了呢?下面,2013系统下载网小编教你解决win7系统插入耳机或音响没有声音的操作方法. 详解操作步骤: 其实 ...

  7. 解决联想小新air13pro笔记本电脑插入耳机没声音的问题

    不知道是不是电脑的问题,我的联想小新经常插入耳机听不到声音,但是外放是有声音的,而且耳机也没有坏. 后来在网上百度了一下,有很多方法,有一个是有用的,所以在这里记录一下. (1)首先打开电脑的&quo ...

  8. Windows10 插入耳机没声音,安装驱动无效问题解决

    问题记录: 重装了系统之后,插入耳机依旧外放,音量控制中只有扬声器,没有耳机选项,控制面板中也没有Realtek高清晰音频管理器.网上几乎全篇让安装驱动,目的是出现Realtek高清晰音频管理器,从这 ...

  9. Android 音频源码分析——音频设备切换(插入耳机)

    源码分析基于android9.0 通常带线耳机分类 模拟耳机 平时常用的3.5mm或6.3mm接口耳机,接收模拟信号(音频数据需要先处理,转码成pcm格式) Android中模拟耳机由WiredAcc ...

  10. 戴尔电脑插入耳机后麦克风收不到声音或着很吵

    工作中遇到的电脑很多是戴尔的电脑,经常遇到用户反馈说电脑插进3.5mm的耳机后麦克风没声音的问题,现在总结了一下,分享给大家. 一.插入耳机后麦克风收不到声音 (Ⅰ) 使用DELL Audio的机器( ...

最新文章

  1. 使用FileUpload控件上传前预览图片
  2. strstr(),strchr()
  3. python:直接插入和简单选择排序
  4. 字符串匹配(一)—— KMP / MP
  5. 利用hutool实现邮件发送功能
  6. [转载] python跨行 print:多用(),换行符\要小心,少用+或者不用(其它程序代码跨行用\就行,不能用括号)
  7. ubuntu qemu安装教程
  8. Python黑客帝国装逼代码
  9. 2022“美亚杯”第八届中国电子数据取证大赛-个人赛题目
  10. pdf文件展示盖章及下载
  11. 带emoji表情的react输入框组件
  12. Unity 实时显示帧率
  13. Ubuntu 16.04安装的一些基础软件--搜狗输入法、Chrome、网易云音乐、sublime text
  14. 后台服务(Service)
  15. 乔布斯私生女回忆录:我的渣男爸爸Steve Jobs
  16. R语言线性混合效应模型(固定效应随机效应)和交互可视化3案例
  17. Linux 内核0.11 系统调用详解(下)
  18. 亚稳态及信号跨时钟域处理
  19. excel如何将多行多列变成一列
  20. 中国大学生计算机设计大赛

热门文章

  1. 用代码实现通过人人网的登录
  2. python图片表格转excel表格_利用Python+Opencv+pytesser把图像识别为Excel表格
  3. 思科笔记-Four,ospf协议实现全网互通,spf算法,简短总结篇
  4. [生存志] 第140节 武帝定十三州
  5. 前端一倍图、二倍图、多倍图
  6. 超简单通俗易懂的H桥电机驱动
  7. springboot+微信小程序校园疫情智慧防控系统毕业设计源码011133
  8. 利用xlsl.full.js导入excel表格
  9. 高可用PgSQL集群架构设计与落地
  10. java数据过载,处理服务器过载的三大解决方法