我尝试使用这些方法来尝试检测“振铃/静音”开关是否处于活动状态:如何以编程方式感应iPhone静音开关?AVAudioSession类别无法按文档要求运行但是在我的iPhone 4上,“状态”值始终为“扬声器”(而CFStringGetLength(state)返回的长度值始终为7)。有人成功使用过此方法吗?如果是,请问哪种设备和SDK版本?我这样称呼它:- (BOOL)deviceIsSilenced { CFStringRef state; UInt32 propertySize = sizeof(CFStringRef); OSStatus audioStatus = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state); if (audioStatus == kAudioSessionNoError) { NSLog(@"audio route: %@", state) // "Speaker" regardless of silent switch setting, but "Headphone" when my headphones are plugged in return (CFStringGetLength(state) <= 0); } return NO;}-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { AVAudioSession *audioSession = [AVAudioSession sharedInstance]; audioSession.delegate = self; [audioSession setCategory:AVAudioSessionCategoryAmbient error:nil]; [audioSession setActive:YES error:nil]; NSLog(@"muted? %i", [self deviceIsSilenced]); ...}我当时在想,当电话上的物理开关切换时,可能会触发其他(更准确)的kAudioSessionProperty事件。有人有想法么?顺便说一句,我在我的[AVAudioSession sharedInstance]中使用了AVAudioSessionCategoryAmbient类别。
3 回答
不负相思意
TA贡献1777条经验 获得超10个赞
我浏览了这个VSSilentSwitch库。
对我不起作用(当您开始实际使用音频时不起作用)。
我在考虑他是如何做到的,然后意识到,当我们沉默时,几乎在声音开始播放后就立即调用音频完成呼叫。
更具体一点:
使用AudioServicesPlaySystemSound
播放的系统声音将在开始播放后立即完成播放。
当然,这仅适用于尊重静音开关的音频类别(默认情况下AVAudioSessionCategoryAmbient
遵守它)。
因此,诀窍是创建系统声音,最好是无声声音,并一遍又一遍地播放它,同时检查从播放到完成所花费的时间(使用安装安装过程AudioServicesAddSystemSoundCompletion
)。
如果完成过程很快被调用(允许某个阈值),则表示静音开关已打开。
此技巧有很多警告,最大的一个事实是它不能在所有音频类别上使用。
如果您的应用程序在后台播放音频-请确保您在后台播放时停止此测试,否则您的应用程序将永远在后台运行(并且也会被苹果拒绝)。
- 3 回答
- 0 关注
- 653 浏览
添加回答
举报
0/150
提交
取消