【发布时间】:2010-12-15 09:43:10
【问题描述】:
我正在使用AVAudioPlayer 类在我的应用程序中播放 .mp3 文件。是否可以通过程序检查耳机是否连接到设备?
在第一代 iPod 设备中,当没有连接耳机时,音量控制栏是隐藏的(用于音乐和视频)。
【问题讨论】:
标签: iphone avaudioplayer
我正在使用AVAudioPlayer 类在我的应用程序中播放 .mp3 文件。是否可以通过程序检查耳机是否连接到设备?
在第一代 iPod 设备中,当没有连接耳机时,音量控制栏是隐藏的(用于音乐和视频)。
【问题讨论】:
标签: iphone avaudioplayer
AudioSessionGetProperty 和 AudioSessionAddPropertyListener 在 iOS 7 中已弃用。
改为使用:AVAudioSessionRouteChangeNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleRouteChange:) name:AVAudioSessionRouteChangeNotification object:nil];
听众,
-(void)handleRouteChange:(NSNotification*)notification
{
NSInteger reason = [[[notification userInfo] objectForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
switch (reason) {
case AVAudioSessionRouteChangeReasonOldDeviceUnavailable :
break;
case AVAudioSessionRouteChangeReasonNewDeviceAvailable :
break;
case AVAudioSessionRouteChangeReasonOverride :
break;
case AVAudioSessionRouteChangeReasonCategoryChange :
break;
case AVAudioSessionRouteChangeReasonWakeFromSleep :
break;
case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory :
break;
case AVAudioSessionRouteChangeReasonRouteConfigurationChange :
break;
case AVAudioSessionRouteChangeReasonUnknown:
default:
break;
}
}
【讨论】:
dispatch_async(dispatch_get_main_queue(), ^{ // Your method });
您可以通过使用kAudioSessionProperty_AudioRoute 属性调用AudioSessionGetProperty 来获取当前音频“路由”。
这会为您提供一个字符串,例如“耳机”或“扬声器”。
您也可以使用AudioSessionAddPropertyListener 来监听路线何时发生变化(例如断开耳机)
查看苹果文档here
【讨论】:
有两种方法:
1) 检查音频路由的瞬时状态
Detect if headphones (not microphone) are plugged in to an iOS device
这个答案为你提供了一个现成的方法来检测耳机是否插入。
2) 监控路由变化事件,并在耳机和非耳机之间的路由变化时设置一个标志
How to programmatically detect earpiece in iphone?
(可能希望将第一个链接中的代码添加到此链接中,以实际确定耳机/非耳机状态是否已在路由更改回调中更改)
【讨论】: