【问题标题】:How to Play a sound using AVAudioPlayer when in Silent Mode in iPhone如何在 iPhone 的静音模式下使用 AVAudioPlayer 播放声音
【发布时间】:2012-05-06 12:20:12
【问题描述】:

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

是否可以通过使用AVAudioPlayer来完成(不使用AVAudioSession)

(适用于 ios 3.0+)

提前致谢。

【问题讨论】:

  • 如果设备处于静音模式,请不要播放声音。用户已明确请求静音!
  • @JonathanGrynspan - 当用户记得他们要求保持沉默时,这是有道理的,但是如果您制作的应用程序具有 AV 特性,您将被此类评论淹没:"音频不工作 ★☆☆☆☆"

标签: iphone ios avaudioplayer silent


【解决方案1】:

实际上,您可以这样做。它通过音频会话控制,与AVAudioPlayer 本身无关。为什么不想使用 AudioSession?他们一起玩得很好......

在你的应用程序中,你应该初始化音频会话,然后你也可以告诉你想要播放什么样的音频。如果您是音乐播放器,那么即使启用响铃/静音开关,用户也希望听到音频是有道理的。

    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; 布尔结果 = 否; if ([audioSession respondsToSelector:@selector(setActive:withOptions:error:)]) { 结果 = [audioSession setActive:YES withOptions:0 error:&error]; // iOS6+ } 别的 { [audioSession setActive:YES withFlags:0 error:&error]; // iOS5 及以下 } 如果(!结果 && 错误){ // 处理错误 } 错误=无; 结果 = [audioSession setCategory:AVAudioSessionCategoryPlayback 错误:&error]; 如果(!结果 && 错误){ // 处理错误 }

鉴于对此答案的最新评论,我想我会将其发布为替代方案。 :-)

【讨论】:

  • 我曾经使用这种方法,但现在它似乎不再起作用了。有没有其他人注意到这一点?
  • @iphonic 不知道该告诉你什么。我在 2013 年 11 月 6 日发布的代码是我今天在 App Store 上的应用程序中的代码。它在我自己的手机上(大惊喜)。当我手机的响铃/静音开关设置为静音(静音)时,我会听到应用程序的音频。您的音量不能一直降低;确保您的音量已调高。除了向您的用户显示音量和播放控制 UI 之外,没有任何编程方式可以让您调高音量,如果这是问题的话。
【解决方案2】:

MarkGranoff's solution 是正确的。但是,如果您更喜欢在 Obj-c 而不是 C 中执行此操作,则以下方法也可以:

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

【讨论】:

  • 谢谢 wL_ 。我更喜欢 Obj-C 代码来实现这一点:) 完美运行
  • 删除代码中的错误检查并不能使其成为 Obj-C,您的答案与 MarkGranoff 的原始答案相同
  • @Thiru 这个答案现在已经无关紧要了。但它是在马克编辑之前发布的。
【解决方案3】:

以上答案都是正确的。以下是 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)
}

【讨论】:

    【解决方案4】:

    Swift 4 简单版:

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

    【讨论】:

      【解决方案5】:

      这样就可以解决问题(使用AVAudioSession

      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
      try AVAudioSession.sharedInstance().setActive(true)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-15
        • 1970-01-01
        • 2011-04-14
        相关资源
        最近更新 更多