• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 检测iOS中静音模式的状态

[复制链接]
菜鸟教程小白 发表于 2022-12-12 18:05:06 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有一个应用程序使用 AudioServicesPlaySystemSound(1104) 方法在某些点击事件上播放声音。它响应静音模式和非静音模式的状态,并相应地静音。

但是,无论振动开关处于什么状态,AudioServicesPlaySystemSound(1150) 都会播放。

如何检查振动模式的状态,以便在用户期望的时候静音?

谢谢



Best Answer-推荐答案


似乎有一个开源项目可以做到这一点。见 here for the code and a sample project . RBDMuteSwitch 是这里的关键类。您使用它(作为单例),并将您的类设置为 RDBMuteSwitch 的委托(delegate),以获取有关开关状态的通知。您将在开关 更改 或第一次调用 [[RBDMuteSwitch sharedInstance] detectMuteSwitch] 时收到通知。在 iOS 9 上测试。

这是 RBDMuteSwitch.m 的重要内容,以防 github 链接失效:

- (void)playbackComplete {
    if ([(id)self.delegate respondsToSelectorselector(isMuted]) {
        // If playback is far less than 100ms then we know the device is muted
        if (soundDuration < 0.010) {
            [delegate isMuted:YES];
        }
        else {
            [delegate isMuted:NO];
        }
    }
    [playbackTimer invalidate];
}

static void soundCompletionCallback (SystemSoundID mySSID, void* myself) {
    AudioServicesRemoveSystemSoundCompletion (mySSID);
    [[RBDMuteSwitch sharedInstance] playbackComplete];
}

- (void)incrementTimer {
    soundDuration = soundDuration + 0.001;
}

- (void)detectMuteSwitch {
#if TARGET_IPHONE_SIMULATOR
    // The simulator doesn't support detection and can cause a crash so always return muted
    if ([(id)self.delegate respondsToSelectorselector(isMuted]) {
        [self.delegate isMuted:YES];
    }
    return;
#endif

#if __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED
    // iOS 5+ doesn't allow mute switch detection using state length detection
    // So we need to play a blank 100ms file and detect the playback length
    soundDuration = 0.0;
    CFURLRef        soundFileURLRef;
    SystemSoundID   soundFileObject;

    // Get the main bundle for the app
    CFBundleRef mainBundle = CFBundleGetMainBundle();

    // Get the URL to the sound file to play
    soundFileURLRef  =  CFBundleCopyResourceURL(mainBundle,
                                                CFSTR ("detection"),
                                                CFSTR ("aiff"),
                                                NULL);

    // Create a system sound object representing the sound file
    AudioServicesCreateSystemSoundID (soundFileURLRef,
                                      &soundFileObject);

    AudioServicesAddSystemSoundCompletion (soundFileObject,NULL,NULL,
                                           soundCompletionCallback,
                                           (void*) self);

    // Start the playback timer
    playbackTimer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selectorselector(incrementTimer) userInfo:nil repeats:YES];
    // Play the sound
    AudioServicesPlaySystemSound(soundFileObject);
    return;
#else
    // This method doesn't work under iOS 5+
    CFStringRef state;
    UInt32 propertySize = sizeof(CFStringRef);
    AudioSessionInitialize(NULL, NULL, NULL, NULL);
    AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
    if(CFStringGetLength(state) > 0) {
        if ([(id)self.delegate respondsToSelectorselector(isMuted]) {
            [self.delegate isMuted:NO];
        }
    }
    if ([(id)self.delegate respondsToSelectorselector(isMuted]) {
        [self.delegate isMuted:YES];
    }
    return;
#endif
}

从本质上讲,代码所做的是调用 AudioServicesPlaySystemSound() 以获得已知持续时间的无声剪辑,并测试播放需要多长时间。如果播放持续时间小于预期时间,则表示静音开关已打开。

关于ios - 检测iOS中静音模式的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34699153/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap