我有一个iOS应用程序,在某些地方有一些音频反馈,但我希望用户在后台播放的任何其他音乐都可以播放。此外,我希望我的应用程序中的音频尊重静音开关。根据开发人员文档,此功能应该由AVAudioSession环境类别启用。这是我正在使用的代码:
if (!hasInitialisedAudioSession) {
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setCategory:AVAudioSessionCategoryAmbient error:NULL];
[session setActive:YES error:NULL];
hasInitialisedAudioSession = YES;
}
代码执行得很好,确实让应用程序听起来在iPod音乐上播放。然而,它不做的是尊重静音开关。我已经尝试将此代码换成类似的C音频调用(类似于AudioSessionSetProperty),而不是Objective-C调用,但我得到了相同的结果 - 环境会话类别根本不想尊重静音开关,尽管如此文档说应该这样做。
有什么想法吗?谢谢你的帮助:)
答案 0 :(得分:0)
我认为我设法解决了 - 事实证明它与我的应用程序完全无关,而是与iPod应用程序无关。当iPod没有播放时,我的应用程序遵循静音开关,然后允许iPod播放它 - 我想要的所有行为。但是,当iPod播放时,应用程序停止响应静音开关,所以我认为这只是iPod对设备音频设置的影响。如果我真的想花时间在它上面,我可能会解决这个问题,但只要它在iPod没有播放的时候服从静音开关就足够了。
编辑:要解决此问题,只需使用此功能确定静音开关是否手动打开,如果结果为是,则不播放声音。但是,如果您没有中央音频管理员课程,可能会有点痛苦。如果Apple可以在他们的文档中发布这种行为,那就太好了。
- (BOOL)deviceIsSilenced
{
#if TARGET_IPHONE_SIMULATOR
// return NO in simulator. Code causes crashes for some reason.
return NO;
#endif
CFStringRef state;
UInt32 propertySize = sizeof(CFStringRef);
AudioSessionInitialize(NULL, NULL, NULL, NULL);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &propertySize, &state);
return (CFStringGetLength(state) <= 0);
}