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

我尝试使用这些方法来尝试检测“振铃/静音”开关是否处于活动状态:


如何以编程方式感应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类别。


月关宝盒
浏览 654回答 3
3回答

不负相思意

我浏览了这个VSSilentSwitch库。对我不起作用(当您开始实际使用音频时不起作用)。我在考虑他是如何做到的,然后意识到,当我们沉默时,几乎在声音开始播放后就立即调用音频完成呼叫。更具体一点:使用AudioServicesPlaySystemSound播放的系统声音将在开始播放后立即完成播放。当然,这仅适用于尊重静音开关的音频类别(默认情况下AVAudioSessionCategoryAmbient遵守它)。因此,诀窍是创建系统声音,最好是无声声音,并一遍又一遍地播放它,同时检查从播放到完成所花费的时间(使用安装安装过程AudioServicesAddSystemSoundCompletion)。如果完成过程很快被调用(允许某个阈值),则表示静音开关已打开。此技巧有很多警告,最大的一个事实是它不能在所有音频类别上使用。如果您的应用程序在后台播放音频-请确保您在后台播放时停止此测试,否则您的应用程序将永远在后台运行(并且也会被苹果拒绝)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

iOS