即使在静音模式下也可以在iPhone上播放声音

63

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


15
如果我是用户,我会对那个“功能”感到警觉...毕竟,将手机设置为静音模式的用户可能希望手机保持安静。 - William Niu
3
我认为静音模式的目的是使手机保持静音 - Yi Jiang
1
@pankaj 在这种情况下,你尝试过反其道而行之吗:把所有“不重要”的电话设置为静音?这可能更可行。 - William Niu
15
我想发表一些自己的看法,解释为什么这是完全良好的用户体验(如果没有滥用的话)。简单的例子包括闹钟应用程序和用户明确要求播放视频的应用程序。当你明确告诉一个应用程序要向你呈现视频,却又想起你已经将设备静音时,这很烦人。静音是用来消除非预定的干扰声,比如电话、短信和其他警报提示。将其等同于断开扬声器并不有益......尤其是当你可以将音量调到零来实现这一点时。 - Chris Trahey
3
我愿意支持ctrahey的观点;我正在开发一款收音机应用,如果用户按下“播放”按钮,他期望能够听到声音。我不希望用户必须取消静音才能收听广播。此外,他也不会被未预定的声音所打扰。我认为这完全是可以接受的,与@WilliamNiu的说法相反。 - Gil Sand
显示剩余5条评论
8个回答

129

虽然并不建议这样做,但我有什么资格说你不能这么做呢。你可能有一个很好的理由来播放声音。

如果你正在使用音频会话(Audio Sessions),那么请在文件开头包含<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类参考。


有没有任何代码可以在静音模式下播放声音? - Pankaj Kainthla
大家好,首先感谢cool_me5000的回答。在我的情况下,当应用程序处于后台(音量最小)时,声音会响起,但如果应用程序处于前台(音量最小),则声音不会响起。我正在iPod touch第4代上进行测试(我之所以这样说是因为它没有静音开关)。你知道我可以改变什么来实现应用程序在两种情况下都发出声音吗? - xarly
1
如果您在这里遇到问题,因为此解决方案无法在iPad上工作,只能在iPhone上工作:当我在呈现AVPlayerViewController之前设置AVAudioSession类别时,我遇到了这个问题。如果我在presentViewController调用的完成块中设置类别(并在实际调用play()之前),则在两个设备系列上都可以正常工作。 - Jerrot

19

对于Swift 2、3、4.2版本

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

12

是的,您可以在手机静音时播放声音。只需使用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);
要使这个工作,您需要导入 header 文件,并将 AudioToolbox.framework 添加到您的项目中。
就是这样。
因此,从这个答案中,您现在知道您可以在手机处于震动状态时播放声音。 您不需要额外或特殊的代码来允许您执行此功能,因为它默认已经具备该功能。 Pk

2
不支持iOS9。 - user2875404
1
我目前暂时没有答案,因为我还没有需要做这件事情。此外,这个问题已经有6年了,如果有人有iOS 9的答案,请随意编辑。 - Pavan
我知道这是一个旧帖子,但现在我有一个类似的问题,即医疗应用程序必须在电话处于静音模式时警报工作人员。我正在使用iOS 10.2设备和以下代码,部分取自Apple文档,在Debug模式下工作,而电话处于静音模式时不起作用,但在非Debug模式下运行时也不起作用。 - men
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; NSError *setCategoryError = nil; BOOL success = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&setCategoryError]; NSError *activationError = nil; success = [audioSession setActive:YES error:&activationError]; CFURLRef soundFileURLRef; soundFileURLRef = CFBundleCopyResourceURL (CFBundleGetMainBundle(),CFSTR("dings"),CFSTR("caf"),NULL); AVAudioPlayer *player = [[AVAudioPlayer alloc] initWithContentsOfURL:(__bridge NSURL * _Nonnull)(soundFileURLRef) error:nil]; [player play]; - men
这并不能解决使用合成器/振荡器而不是播放音频文件的合成应用程序的问题。 - pete
实际上,即使只使用AVAudioEngine,它仍然有效。创建一个引用共享的AVAudioSession并在其上设置类别;它就可以工作了。 - pete

11

适用于 iOS 6 及以上版本

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

1
在 Swift 中,使用以下代码块来设置音频会话:do { try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) try AVAudioSession.sharedInstance().setActive(true) } catch let error as NSError { // 处理错误 } - Guy

3

只需将以下内容放入viewDidLoad中:

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

2

如果需要在静音模式下或后台播放声音,请尝试以下方法:

将以下代码放入application: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头文件。

1

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

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

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

1

对于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];

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