我正在开发一款iPad应用程序,可连接播放声音的配件。当iPad连接到配件时,我想将所有系统声音静音但允许其他声音(iPod)。
部分原因是附件是在现场演出期间使用的。显然,让电子邮件,警报或任何其他系统声音通过并放大(疯狂大声)会很烦人。
我查看了使用AVAudioSession(阅读Audio Sessions了解详情)并尝试了所有AudioSessionCategories。这些类别都不会使系统声音静音,而是只允许您静音应用程序声音(iPod) - 对我的目的无用。
我还在“System Sound Services”上找到了文档,但这只允许你播放系统声音。这里没有api可以在您的应用运行时禁用系统声音。
最后一点,我们通过包含MPVolumeView轻松调整iPad级别(音量),但我们希望用户想要播放iPod音乐。如果在播放iPod音乐(或来自其他应用程序的音乐)和电子邮件时,您会惊讶地发现,当通过我们的配件时,电子邮件突然变成了LOUD / ANNOYING。甚至可能会损坏设备。 :d
答案 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)
您可以做的最好是鼓励您的用户进入飞行模式。