【问题标题】:Play sound on iPhone even in silent mode [duplicate]即使在静音模式下也能在 iPhone 上播放声音 [重复]
【发布时间】:2011-04-14 00:31:41
【问题描述】:

我想制作一个应用程序,它可以在 iPhone 处于静音模式时创建声音、音乐或系统声音。在静音模式下是否可以播放任何类型的声音,无论是音乐还是系统音?

【问题讨论】:

  • 如果我是用户,我会被那个“功能”提示...毕竟,将手机置于静音模式的用户可能希望手机保持安静。
  • 我以为静音模式的目的是让手机保持静音?
  • @pankaj 在这种情况下,您是否尝试过相反的方法:将所有“不重要”的呼叫静音?这可能更可行。
  • 我想谈谈为什么这是非常好的用户体验(如果没有被滥用)。简单的示例是警报应用程序和用户显式播放视频的应用程序。与应用程序进行物理通信是很烦人的,它应该向您展示一个视频,只是为了回忆您已将设备静音。静音用于消除计划外的干扰,例如电话、短信和其他警报。将其等同于断开扬声器是没有帮助的……尤其是当您可以简单地将音量设置为零来实现这一点时。
  • 我想和 ctrahey 一起去这里;我正在制作一个广播应用程序,如果用户按下“播放”,他希望声音出来。我不希望他必须取消手机静音才能收听广播。最重要的是,他不会被计划外的声音打扰。我认为这是完全可以接受的,反对@WilliamNiu 所说的

标签: iphone objective-c ipad avaudioplayer


【解决方案1】:

这是不可取的,但我能说你做不到。您可能有充分的理由播放声音。

如果您使用的是音频会话,请在文件开头包含 <AVFoundation/AVFoundation.h> 并

[[AVAudioSession sharedInstance]
                setCategory: AVAudioSessionCategoryPlayback
                      error: nil];

应该可以解决问题。请注意,如果您播放音乐或声音,则 iPod 播放将暂停。

完成此操作后,可能在您播放声音的某个类的初始化中某处,您可以像这样实例化声音:

// probably an instance variable: AVAudioPlayer *player;
NSString *path = [[NSBundle mainBundle] pathForResource...];
NSURL *url = [NSURL fileURLWithPath:path];
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url];

完成后,您可以随时使用它:

[player play]; // Play the sound
[player pause]; // Pause the sound halfway through playing
player.currentTime += 10 // skip forward 10 seconds
player.duration // Get the duration

还有其他好东西。查找AVAudioPlayer 类参考。

【讨论】:

  • 有什么代码可以在静音模式下播放声音
  • 大家好,首先感谢cool_me5000 的回答。在我的情况下,当应用程序在后台(音量最小)时声音会响起,但如果应用程序在前台(音量最小),声音不会响起。我正在测试 iPod touch 4 代(我这么说是因为它没有静音开关)。你知道我可以改变什么来实现应用在这两种情况下的声音吗?
  • 万一你到这里了,因为这个解决方案不能在 iPad 上运行,而只能在 iPhone 上运行:我在设置 AVAudioSession 类别时遇到了这个问题,然后再呈现 AVPlayerViewController。如果我在 presentViewController 调用的完成块中设置类别(并且在实际调用 play() 之前)它在两个设备系列上都可以正常工作。
【解决方案2】:

对于 Swift 2、3、4.2

    do {
      try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback)
      try AVAudioSession.sharedInstance().setActive(true)
    } catch {
      print(error)
    }

【讨论】:

    【解决方案3】:

    是的,您可以在手机设置为振动时播放声音。 只需使用 AVAudioPlayer 类。

    默认情况下,播放音频会话 声音将~不~尊重设置 iPhone 上的静音开关。在 换句话说,如果你打电话给 播放声音和静音(硬件) 打开 iPhone 设置为静音, 你仍然会听到声音。

    这就是你想要的。所以现在您知道在手机处于静音模式时播放音频会话仍然会播放声音,您只需要知道如何创建音频会话来播放声音,如下所示: 取自本网站:http://iosdevelopertips.com/audio/playing-short-sounds-audio-session-services.html

    SystemSoundID soundID;
    NSString *path = [[NSBundle mainBundle]
       pathForResource:@"RapidFire" ofType:@"wav"];    
    
    AudioServicesCreateSystemSoundID((CFURLRef)[NSURL fileURLWithPath:path],&soundID);
    AudioServicesPlaySystemSound (soundID);
    

    为此,您需要导入头文件,并将 AudioToolbox.framework 添加到您的项目中。

    就是这样。

    因此,从这个答案中,您现在知道您可以在手机振动时播放声音。 您不需要额外的或特殊的代码来允许您执行此功能,因为默认情况下它已经执行此操作。

    PK

    【讨论】:

    • 不适用于 iOS9
    • 有没有人在 iOS 9 上找到解决方案?
    • 请介绍一下 iOS9 的解决方案?
    • 这在 iOS9+ 上不起作用你找到解决办法了吗?
    • 我目前还没有答案,因为我还没有需要这样做。另外,这个问题已有 6 年历史,如果有人对 iOS 9 有答案,请随时编辑。
    【解决方案4】:

    适用于 iOS 6 及更高版本

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

    【讨论】:

    • 在斯威夫特do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) } catch let error as NSError { // report error }
    【解决方案5】:

    把这个放在你的viewDidLoad:

    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
    AudioSessionSetProperty (kAudioSessionProperty_AudioCategory,
                             sizeof(sessionCategory), &sessionCategory);
    

    【讨论】:

      【解决方案6】:

      要在静音模式下播放声音,即使它进入后台,试试这个:

      将此代码放入应用程序:didFinishLaunchingWithOpitons:

      [[AVAudioSession sharedInstance] setDelegate:self];
      [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
      [[AVAudioSession sharedInstance] setActive:YES error:nil];
      [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
      

      和 applicationDidEnterBackground 中的这段代码:

      [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
      [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
      

      还设置了播放音频/空中播放的背景模式并包含 AVFoundation 标头。

      【讨论】:

        【解决方案7】:

        对于 Objective C,您可以使用以下代码播放系统声音:

        [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
        *The system path could be modified.*
        NSString *path = @"/System/Library/Audio/UISounds/begin_record.caf";
        NSURL *url = [NSURL fileURLWithPath:path];
        player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
        [player play];
        

        【讨论】:

          【解决方案8】:

          Swift - 在播放音频/视频之前调用此函数以在手机处于静音状态时强制播放。这也会使当前正在播放的其他音频静音。

          如果您不想让其他音频静音,您可以将.duckOthers 更改为.mixWithOthers。

          func setupAudio() {
            let audioSession = AVAudioSession.sharedInstance()
            _ = try? audioSession.setCategory(AVAudioSessionCategoryPlayback, with: .duckOthers)
            _ = try? audioSession.setActive(true)
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-06
            • 1970-01-01
            • 1970-01-01
            • 2015-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多