2012-04-25 142 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) 
相關問題