为了账号安全,请及时绑定邮箱和手机立即绑定

使用AVAudioPlayer检测iPhone的“铃声” /“静音” /“静音”开关不起作用?

使用AVAudioPlayer检测iPhone的“铃声” /“静音” /“静音”开关不起作用?

iOS
月关宝盒 2019-10-26 13:24:48
我尝试使用这些方法来尝试检测“振铃/静音”开关是否处于活动状态:如何以编程方式感应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)。
如果完成过程很快被调用(允许某个阈值),则表示静音开关已打开。
此技巧有很多警告,最大的一个事实是它不能在所有音频类别上使用。
如果您的应用程序在后台播放音频-请确保您在后台播放时停止此测试,否则您的应用程序将永远在后台运行(并且也会被苹果拒绝)。

查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 653 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信