2013-08-30 115 views
3

我已經閱讀了很多關於這個主題的文章,但答案並沒有100%清楚。我在這裏尋找清晰的。iOS AVAudioPlayer音量控制

我的應用程序定期播放短AVAudioPlayer聲音。問題是,我只能在第一個聲音播放後設置音量。

在閱讀stackoverflow後,似乎每個人似乎都建議我在應用程序的開始播放虛擬(無聲)AVAudioPlayer聲音,以將設備的音量按鈕「鏈接」到「應用程序音量」。換句話說,當應用程序啓動時,它是默認控制的「林格」音量,只有在播放第一個聲音後,設備的音量按鈕纔會最終控制「應用程序音量」(AVAudioPlayer音量)(它是沒有任何標籤的圖像)。不幸的是,當這種情況發生時,用戶聽不到第一聲音,現在看到應用程序被破壞。

我的問題是,這是答案嗎?在應用程序開始時,我是否只需播放短暫的虛擬聲音以將設備的音量按鈕「鏈接」到應用程序?

Reference Image

回答

4

你不必打啞的聲音。使用AudioToolbox框架可以設置AudioSessionActive如下:

AudioSessionInitialize (NULL, NULL, NULL, NULL); 
UInt32 sessionCategory = kAudioSessionCategory_AmbientSound; 
AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory); 
AudioSessionSetActive (true); 

這將允許音量按鈕來控制音量的應用程序。

看到這個問題:Cannot Control Volume of AVAudioPlayer via Hardware Buttons when AudioSessionActive is NO關於這種方法的更多信息。

1

對於將來的答案搜索者,由於AudioSessionInitializeAudioSessionSetActive在iOS7中已被棄用,處理硬件音頻和獲取回叫的推薦方式是使用AVAudioSession對象。將該會話設置爲會話的@"outputVolume"屬性上的應用和KVO的活動狀態。

- (id)init 
{ 
    self = [super init]; 
    if (self) 
    { 

     self.audioSession = [AVAudioSession sharedInstance]; 
     [_audioSession setActive:YES error:nil]; 
     [_audioSession addObserver:self forKeyPath:@"outputVolume" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:NULL]; 
    } 
    return self; 
} 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"outputVolume"]) 
    { 
     [self setVolume:[change[@"new"] floatValue]]; 
    } 
} 

- (void)dealloc 
{ 
    [_audioSession removeObserver:self forKeyPath:@"outputVolume"]; 
    [_audioSession setActive:NO error:nil]; 
}