2012-04-25 49 views
14

即使在iPhone的静音模式下,我也想播放声音。如何在iPhone的静音模式下使用AVAudioPlayer播放声音

它可以通过提前使用AVAudioPlayer(不使用AVAudioSession)

(适用于iOS 3.0+)

感谢来完成。

+4

如果设备是静音模式,不播放声音。用户明确要求保持沉默! – 2012-04-25 19:15:34

+0

为什么没有AVAudioSession? – 2012-04-25 19:44:07

+2

@JonathanGrynspan - 当用户_remembers_他们请求沉默时有意义,但如果您制作AV性质的应用程序,您将被这种评论淹没:“音频不工作★☆☆☆☆” – 2012-10-10 15:34:14

回答

27

其实,你可以做到这一点。它通过音频会话进行控制,与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播放音频,并启用了环/静音开关,我可以听到声音。

UPDATE(2013年11月6日)

在我上面提到的,其中I以上成功地使用的代码,我有(一段时间)被用下面的代码代替来达到同样的应用结果:

 
     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) { 
      // deal with the error 
     } 

     error = nil; 
     result = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error]; 

     if (!result && error) { 
      // deal with the error 
     } 

我想我会张贴此作为替代,根据最新评论这个答案。 :-)

+0

感谢你的回应,它工作得很好:) – Nima 2012-04-26 20:02:06

+0

很高兴听到它。 :-) – 2012-04-26 20:07:02

+0

我曾经使用这种方法,但现在一天它似乎不再工作。有没有其他人注意到这一点? – 2013-11-06 01:27:27

22

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

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

谢谢wL_。我更喜欢Obj-C代码来实现这个:)完美地工作 – iOSAppDev 2014-07-18 05:46:43

+0

删除代码中的错误检查并不会使它成为Obj-C,你的ans和原来的答相同MarkGranoff – Thiru 2015-05-27 07:39:08

+0

@Thiru现在这个答案是无关紧要的。但是在Mark的编辑之前发布了它。 – 2015-12-04 23:56:33

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) 
} 
0

这将只是做的伎俩(使用AVAudioSession

try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback) 
try AVAudioSession.sharedInstance().setActive(true) 
相关问题