gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:55:52 43 4
gpt4 key购买 nike

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

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

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

谢谢

最佳答案

似乎有一个开源项目可以做到这一点。参见 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 respondsToSelector:@selector(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 respondsToSelector:@selector(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 selector:@selector(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 respondsToSelector:@selector(isMuted:)]) {
[self.delegate isMuted:NO];
}
}
if ([(id)self.delegate respondsToSelector:@selector(isMuted:)]) {
[self.delegate isMuted:YES];
}
return;
#endif
}

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

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

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com