如何禁用iOS系统声音

时间:2011-06-08 19:52:49

标签: iphone ios ipad

我正在开发一款iPad应用程序,可连接播放声音的配件。当iPad连接到配件时,我想将所有系统声音静音但允许其他声音(iPod)。

部分原因是附件是在现场演出期间使用的。显然,让电子邮件,警报或任何其他系统声音通过并放大(疯狂大声)会很烦人。

我查看了使用AVAudioSession(阅读Audio Sessions了解详情)并尝试了所有AudioSessionCategories。这些类别都不会使系统声音静音,而是只允许您静音应用程序声音(iPod) - 对我的目的无用。

我还在“System Sound Services”上找到了文档,但这只允许你播放系统声音。这里没有api可以在您的应用运行时禁用系统声音。

最后一点,我们通过包含MPVolumeView轻松调整iPad级别(音量),但我们希望用户想要播放iPod音乐。如果在播放iPod音乐(或来自其他应用程序的音乐)和电子邮件时,您会惊讶地发现,当通过我们的配件时,电子邮件突然变成了LOUD / ANNOYING。甚至可能会损坏设备。 :d

3 个答案:

答案 0 :(得分:14)

可以使用AVSystemController更改系统声音,结果证明是铃声btw。但是,AVSystemController存在于私有Celestial框架中。由于UIKit引用了这个框架,因此仍然可以在不直接引用它的情况下使用该类。

Apple禁止使用私有API,因此仅此一点就是个坏主意。鉴于我的情况,我认为他们可能会例外,但我可能会放弃这个课程,因为我认为它没有解决我的问题。它确实使声音静音,但是一旦我插入我的配件,即使振铃音量设置为0,系统也会以最大音量发出声音。这让我相信解决问题的答案就在于MFI文件。

无论如何,这里是如何使用私有框架/ api更改铃声(如果没有某种特殊许可,将拒绝您的应用)。

简短回答:

[[AVSystemController sharedAVSystemController] setVolumeTo:0 forCategory:@"Ringtone"];

回答而无需直接引用Celestial frameork / AVSystemController.h:

- (void) setSystemVolumeLevelTo:(float)newVolumeLevel
{   
    Class avSystemControllerClass = NSClassFromString(@"AVSystemController");
    id avSystemControllerInstance = [avSystemControllerClass performSelector:@selector(sharedAVSystemController)];

    NSString *soundCategory = @"Ringtone";

    NSInvocation *volumeInvocation = [NSInvocation invocationWithMethodSignature:
                                      [avSystemControllerClass instanceMethodSignatureForSelector:
                                       @selector(setVolumeTo:forCategory:)]];
    [volumeInvocation setTarget:avSystemControllerInstance];
    [volumeInvocation setSelector:@selector(setVolumeTo:forCategory:)];
    [volumeInvocation setArgument:&newVolumeLevel atIndex:2];
    [volumeInvocation setArgument:&soundCategory atIndex:3];
    [volumeInvocation invoke];
}

答案 1 :(得分:3)

使用MediaPlayer框架,我们可以设置SYSTEM声音的级别

[[MPMusicPlayerController applicationMusicPlayer] setVolume:0]; 

答案 2 :(得分:1)

您可以做的最好是鼓励您的用户进入飞行模式。