如何在iPhone的静音模式下使用AVAudioPlayer播放声音

21

我希望在iPhone的静音模式下播放声音。

是否可以使用 AVAudioPlayer(不使用 AVAudioSession)来实现?

(适用于iOS 3.0+版本)

提前致谢。


4
如果设备处于静音模式,请勿播放声音。用户明确要求安静! - Jonathan Grynspan
6
@JonathanGrynspan - 当用户记得他们请求静音时,这是有意义的,但如果你制作的应用程序属于AV性质,你会被这种评论淹没:“音频不工作★☆☆☆☆” - Rhythmic Fistman
6个回答

32

实际上,你可以做到这一点。它由音频会话控制,与AVAudioPlayer本身无关。为什么不想使用音频会话?它们可以很好地协作...

在你的应用中,你应该初始化音频会话,然后你还可以指明你打算播放什么类型的音频。如果你是一个音乐播放器,那么用户可能希望即使启用了铃声/静音开关也能听到音频。

    AudioSessionInitialize (NULL, NULL, NULL, NULL);
    AudioSessionSetActive(true);

    // Allow playback even if Ring/Silent switch is on mute
    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
    AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, 
                             sizeof(sessionCategory),&sessionCategory);
我有一个应用程序,使用AVAudioPlayer播放音频,开启了静音开关后,我可以听到音频。

更新(2013年11月6日)

在我上面提到的应用程序中,我成功使用了上述代码,并且我已经使用以下代码取代它以达到同样的效果:

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *error = nil; BOOL result = NO; if ([audioSession respondsToSelector:@selector(setActive:withOptions:error:)]) { result = [audioSession setActive:YES withOptions:0 error:&error]; // iOS6+ } else { [audioSession setActive:YES withFlags:0 error:&error]; // iOS5 and below } if (!result && error) { // 处理错误 } error = nil; result = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
if (!result && error) { // 处理错误 }
我想发布这个作为一种替代方法,考虑到对此答案的最新评论。 :-)

我曾经使用过这种方法,但现在似乎不再起作用了。有其他人也注意到了吗? - Allen S
@iphonic 不确定该告诉你什么。我在2013年11月6日发布的代码是我今天在应用程序中拥有的代码,该应用程序已经上架App Store。而且它在我的手机上(大惊小怪)。当我的手机的铃声/静音开关设置为静音(静音)时,我可以通过应用听到音频。您的音量不能完全降低;确保您的音量调高。除了向用户呈现音量和播放控制UI之外,如果这是问题,您没有编程方式可以增加音量。 - Mark Granoff

24

MarkGranoff的解决方案 是正确的。不过,如果你更喜欢用Obj-C而不是C来完成它,以下方法也可以:

    NSError *error = nil;
    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&error];
    [[AVAudioSession sharedInstance] setActive:YES error:&error];

谢谢 wL_。我更喜欢使用 Obj-C 代码来实现这个 :) 完美运作。 - iOSAppDev
1
删除代码中的错误检查并不会使其成为Obj-C,你的答案与MarkGranoff的原始答案完全相同。 - Thiru
1
@Thiru 这个回答现在已经不相关了。但是它是在 Mark 编辑之前发布的。 - wL_

5

上面的回答是正确的。以下是Swift版本。

do {
    try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
    //print("AVAudioSession Category Playback OK")
    do {
        try AVAudioSession.sharedInstance().setActive(true)
        //print("AVAudioSession is Active")
    } catch _ as NSError {
        //print(error.localizedDescription)
    }
} catch _ as NSError {
    //print(error.localizedDescription)
}

3

Swift 4简明版:

try? AVAudioSession.sharedInstance().setCategory(.playback, mode: .default, options: [])

2
这很简单(使用AVAudioSession),就能解决问题。
try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
try AVAudioSession.sharedInstance().setActive(true)

0
Swift 5:在AppDelegate的didFinishLaunchingWithOptions方法内部
 do {
                try AVAudioSession.sharedInstance().setCategory(.playback)
                try AVAudioSession.sharedInstance().setActive(true)
                
                // Allow playback even if Ring/Silent switch is on mute
                let sessionCategory = AVAudioSession.Category.playback.rawValue
                let defaultValue: AVAudioSession.Category = .ambient
                try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category(rawValue: sessionCategory) ?? defaultValue)
    
            } catch {
                print("AVAudioSession error: \(error.localizedDescription)")
                
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接