2012-03-20 11 views
0

私はthis questionを前に尋ねましたが、他のスレッドの日付が付けられていて、おそらくあまり言い表せないので、新しいスレッドを開始する必要があります。私は、iOSアプリケーションに音量コントロールを追加するための最良の方法は、ほとんど静かであると思っています。良い例は、あなたがターンに近づいたり、逃したときだけ、オーディオを再生するナビゲーションアプリです。このようなアプリでは、十分に大きくないターンプロンプトが聞こえると、ユーザはプロンプトの音量を聞き取りやすくし、サイドボリュームコントロールを使用して好みのプロンプトに調整します。ほとんどのサイレントiOSアプリでの音量調整

ここにいくつかの問題があります。 1つは、オーディオが現在再生されていないため、ユーザーは、どれだけの音量が増加したかについての参照がないことです。これは多かれ少なかれ予想されますが、私が興味を持っている技術的な問題があります。サイドボリュームコントロールをアプリケーションにリンクするには、オーディオセッションを開始して管理する必要があります。ほとんどのドキュメントでは、あなたが現在再生中であること、またはオーディオを開始していることを前提としているため、このような状況のための信頼できるリファレンスは見つかりませんでした。主に静かなアプリのオーディオセッションを管理することは最悪のケースと思われますが、私が仕事をしている主要なアプリのうちの2つにそのような機能が必要であるという点ではよくあることです。

オーディオセッション管理に関連するさまざまな問題のうち、バックグラウンドを移動したり移動したりするときに、オーディオセッションを強制終了して復元する必要があります。あなたは、セッションを開始したり停止したりするときにオーディオを再生する他のアプリを考慮する必要があります。アプリの種類によっては、スピーカーへのカスタムオーバーライドルーティング、カスタムミュートコントロールなど、他のより高度なニーズがあるかもしれません。そのようなアプリの経験があれば、そのような課題にどのように対処し、他の問題?

+0

あなたはiOSのドキュメントを見ましたか?この振る舞いは人間のインタラクションのガイドラインでよく定義されており、実装例も含めています。 –

+0

あなたの質問は、オントピックであっても、このQ&Aフォーマットには少し広すぎます。 – hotpaw2

答えて

0

非常に一般的な1つのメロドーは、音声が内在するかどうかにかかわらず、明日まで再生されないかどうかにかかわらず、起動時のアプリの種類に適したオーディオセッションカテゴリを設定することです(アプリケーションの目的と設定がそのようにする)。

追加:アプリは沈黙している時に音量を調整するために、ユーザーに許可する

一つの方法は、いくつかの音を再生し、ユーザがすぐに開始するためにあなたのアプリを持っている(および/または多分停止)するためのいくつかの手段を提供することですキャリブレーション・トーン/トーク、著作権表示、商標表示、安全性メッセージなど、アプリの典型的な振幅で表示されます。

+0

オーディオセッションをオーディオカテゴリと混同しています。あなたは、アプリケーションの分類のカテゴリを設定します(例えば、VOIP、ナビゲーションなど)。オーディオを再生する前にセッションを開始することをお勧めします。これは、ユーザーがボリュームを制御できるようにする方法演奏はありませんか? – Cliff

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

私は、Bluetoothオーディオデバイスが接続されている場合にインテリジェントに応答のようなもの、カスタムプレーヤ、カスタムオーディオ圧縮などを作成するためのファクトリメソッドを処理するために、他のコードの束を含んでいます。しかし、主なアイデアは、フォアグラウンドでアプリケーションボリュームにボリュームコントロールをリンクさせようと試みながら、オーディオを再生する他のアプリケーションを処理することです。

関連する問題