2012-03-20 16 views
0

我已經問過this question之前,但我覺得我應該開始一個新的線程,因爲我的另一個線程的日期和可能措辭不佳。我想知道什麼是將音量控制添加到iOS應用程序的最佳方法,大多數情況下是無聲的。一個很好的例子就是導航應用程序,只有在你接近或錯過一個回合時纔會播放音頻。在這樣的應用程序中,聽到不夠響亮的轉向提示,用戶會希望提示的音量能夠被聽到,並且自然地使用旁邊的音量控制來調整提示以符合他們的喜好。音量控制在一個主要是無聲的iOS應用程序

這裏有幾個問題。一個是音頻當前沒有播放,因此用戶沒有提到它已經增加了多少。這或多或少是預期的,但是我更感興趣的是技術問題。要將側音量控制鏈接到您的應用,您必須啓動並管理音頻會話。由於大多數文檔假定您正在播放或正在播放音頻,因此我還沒有找到對這種情況的權威參考。管理大多數無聲應用程序的音頻會話似乎是一個邊緣案例,儘管我發現它很常見,因爲我所從事的兩個主要應用程序都需要這種功能。

在與音頻會話管理相關的各種問題中,您必須在移入和移出背景時解決查找和恢復音頻會話的問題。您必須考慮其他應用程序在開始時播放音頻並停止會話。根據您的應用類型,您可能還有其他更高級的需求,例如自定義替代路由至揚聲器,自定義靜音控制等。如果您對此類應用有任何經驗,可以詳細說明如何解決這些挑戰並闡述其他事宜?

+0

你看過iOS文檔嗎?這種行爲在人機交互準則中有明確的定義,甚至還包含了實現示例。 – 2012-03-20 18:52:00

+0

即使是在話題上,您的問題似乎對於問答格式有點過於寬泛。 – hotpaw2 2012-03-21 00:01:13

回答

0

一個非常常見的方法是在啓動時設置適合應用類型的音頻會話類別,無論聲音是內在的還是直到明天才播放(只要應用的目的和設置是玩這樣)。

補充:

的一種方式,以允許用戶在應用程序是沉默調節音量是提供一些手段爲用戶讓自己的應用立即啓動(和/或可能停止)播放一些聲音其幅度通常爲您的應用程序:例如,一些校準音/談話,您的版權聲明,商標鈴聲或安全信息。

+0

您正在將音頻會話與音頻類別混淆。您可以設置應用程序分類的類別(例如VOIP,導航等)。Apple建議您在播放音頻之前通常先開始一個會話,這突出了我的整體問題,即如何讓用戶在控制音量時控制音量沒有什麼玩法? – Cliff 2012-03-21 21:05:16

0

我在開發大多數無聲應用程序時所看到的主要問題是關於移入/移出前景並與其他音頻很好地播放。爲了更好地瞭解我通常會做的事情,我將給出最近項目的一些片段。 (這些是故意不完整的,只是爲了說明一個觀點。)爲了論證,我們假設我們有一個負責維護音頻會話的AudioManager類。這個類是我們用來實例化我們的自定義音頻播放器的。在這樣的課堂上,我們提出:

@interface MyAudioManager() 
@property (nonatomic, retain) BOOL alwaysMaintainAudioSession; 
@property (nonatomic, retain) MyCustomAudioPlayer *player; 
@end 

@implementation MyAudioManager 
@synthesize alwaysMaintainAudioSession; 
@synthesize player; 

-(void) applicationWillEnterForeground 
{ 
    isInBackground = NO; 
    if (NO==[self anyAudioIsPlaying] && self.alwaysMaintainAudioSession) { 
     [self activateAudioSession]; 
    } 
} 

-(void) activateAudioSession 
{ 
    AudioSessionSetActive(TRUE); 
    AudioSessionAddPropertyListener (kAudioSessionProperty_AudioRouteChange, AudioPropertyListener, self); 
} 

-(BOOL) anyAudioIsPlaying 
{ 
    return [self otherAudioIsPlaying] || [player isPlaying]; 
} 

-(BOOL) otherAudioIsPlaying 
{ 
    UInt32 yesNo; 
    UInt32 propertySize = sizeof(yesNo); 
    OSStatus status = AudioSessionGetProperty(kAudioSessionProperty_OtherAudioIsPlaying, &propertySize, &yesNo); 
    if (kAudioSessionUnsupportedPropertyError == status) { 
     return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState]; 
    } else { 
     return MPMusicPlaybackStatePlaying == [theiPodMusicPlayer playbackState] || yesNo; 
    } 
} 

該管理器允許您設置始終保持聲音鏈接到應用程序的音量控制,這意味着我們始終確保一個屬性或者是會話活動或一些其他應用程序正在播放音頻。在任何其他情況下,音量控制恢復爲控制鈴聲。所以當進入前臺時,我們必須檢查是否有其他音頻播放並有條件地激活音頻會話。我們還需要在移至後臺時關閉會話以恢復鈴聲音量控制。

-(void) applicationDidEnterBackground 
{ 
    if (NO==[self anyAudioIsPlaying]) { 
     AudioSessionSetActive(NO); 
    } 
} 

在我的解決方案我有一堆其他的代碼來處理之類的東西智能響應時的藍牙音頻設備連接,工廠方法用於創建自定義播放器,自定義音頻壓縮等等。然而,主要想法是處理播放音頻的其他應用程序,同時嘗試在前臺保持音量控制與應用程序音量相關聯。

相關問題