オーディオフォーカスをテストする方法
オーディオを再生するアプリは、必ず再生時間と完全に一致した状態で、オーディオフォーカスの取得・解放を正確に行う必要があります。マルチメディアアプリの要件に記載された内容に準拠しなければ、正常に動作するアプリとは見なされません。次のセクションでは、アプリの動作を検証する方法について説明します。
オーディオスタックのステータス確認
オーディオスタックの現在のステータスは、adbで次のコマンドを実行することで確認できます。
adb shell dumpsys audio
返された出力はAndroidのバージョンによって異なりますが、大切なのは最初の部分です。
Audio Focus stack entries (last is top of stack):
source:android.os.BinderProxy@e730bd -- pack: com.amazon.avod -- client: com.amazon.media.AmazonAudioManager@c7cb87ecom.amazon.avod.playbackclient.feature.audiofocus.AudioFocusManager$GlobalAudioFocusChangeListener@c521df -- gain: GAIN -- flags: -- loss: LOSS_TRANSIENT -- uid: 10065 -- attr: AudioAttributes: usage=1 content=2 flags=0x0 tags= bundle=null
source:android.os.BinderProxy@8089640 -- pack: com.amazon.vizzini -- client: com.amazon.media.AmazonAudioManager@461d1c8com.amazon.vizzini.vim.AudioFocusController@4417261 -- gain: GAIN_TRANSIENT_EXCLUSIVE -- flags: -- loss: none -- uid: 10112 -- attr: AudioAttributes: usage=1 content=2 flags=0x0 tags= bundle=null
...
この例では、フォーカススタックに2つのアイテムがあり、それぞれがパッケージ名com.amazon.avod
とcom.amazon.vizzini
のアプリを参照しています。最後のアイテムにはオーディオフォーカスがあり、オーディオを再生するすべての権限があります。リストのほかのすべてのアイテムはオーディオフォーカスを失っていますが、AudioManager.abandonAudioFocus()
を呼び出すまではリストに入れられたままとなります。これは、最後のアイテムより上のすべてのアプリがOnAudioFocusChangeListener()
コールバックを受け取っており、オーディオ再生を一時停止またはミュートしていることも意味しています。
2つ目のアイテムのcom.amazon.vizzini
が、持続時間フラグAUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE
を使用してフォーカスをリクエストしたため、以前スタックの先頭にあったアプリはOnAudioFocusChangeListener()
コールバックをTRANSIENT
値と共に受け取り、loss: LOSS_TRANSIENT
値が最初の行に表示されることになります。
正常に動作するアプリは、スタックに複数回リストされることはありません。 2回目のオーディオフォーカスをリクエストする(次のエピソードを再生する場合など)と、独自のアプリでは前の再生インスタンスがOnAudioFocusChangeListener()
コールバックを受け取ることになります。最初からabandonAudioFocus()
を呼び出すことで、これを確認してください。
同様に、再生が終了したら、リソースを解放してすべてのフォーカスリクエストを破棄し、リストから完全に削除されるようにします。
onAudioFocusChangeコールバックのテスト
次のAudio Focus Requesterツールでは、各種アプリでさまざまなオーディオフォーカスの変更を試すことができます。
次のコマンドを実行して、アプリをインストールします。
adb install -t -r audiofocusrequester.apk
ツールを使用する方法は2つあります。UIを使用する方法と、ADBから送信されたインテントを指定してコマンドラインを使用する方法です。UIを使用する方が簡単です。ドロップダウンボックスを使用してすべてのパラメーターを構成できます。コマンドラインではすべてのパラメーター(ストリームタイプなど)を選択できるわけではありませんが、インテントを送信するとフォーカスの変更が行われるため、タイミングを正確に合わせることができます。
UIを使用する場合
ドロップダウンボックスでは、Androidドキュメントで説明されているすべてのオーディオフォーカスのリクエストパラメーターを選択できます。テストするアプリは、オーディオフォーカスが失われた際にフォアグラウンドでメディアを再生している必要があります。そこで2つの追加のタイムアウトを調整することもできます。ツールによりフォーカスがリクエストされる前の待機ピリオドと、フォーカスがアプリに返される前の待機ピリオドです。
この方法では、テストする用途を選択し、最初のタイマーを開始して、アプリにナビゲーションして再生を開始できます。最初のタイムアウトの有効期限が切れると、ツールによりフォーカスがリクエストされます。次に2番目のタイムアウトが開始され、フォーカスがアプリに返されるまで待機します。
アプリでAudio Focus RequesterのUIを使用するには、次のようにします。
- 対象のアプリとAudio Focus Requesterツールの両方をデバイスにインストールします。
- Audio Focus Requesterツールを起動します。
- フォーカスリクエストとタイムアウトのパラメーターを設定します。
- [Finish setup and start timers] をクリックして、タイマーを起動することを確認します。
- 対象のアプリを起動して、再生を開始します。
- タイムアウトの有効期限が切れるのを待ちます。
コマンドラインを使用する場合
- 対象のアプリとオーディオフォーカスツールの両方をインストールします。
- アプリで再生を開始します。
-
サービス
com.amazon.audiofocusrequester/.AudioFocusRequesterService
にオーディオフォーカスをリクエストしたり破棄したりするようインテントを送信します。次のインテントアクションがサポートされています。
Permanent持続時間ヒント
AUDIOFOCUS_GAIN
を使用してオーディオフォーカスをリクエストするようツールに指示します。FireOS 5および6では以下のようになります。adb shell am startservice -a "permanent" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
Fire OS 7(Android Oreo以降)では以下のとおりです。
adb shell am start-foreground-service -a "permanent" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
想定される動作:
Transient持続時間ヒント
AUDIOFOCUS_GAIN_TRANSIENT
を使用してオーディオフォーカスをリクエストするようツールに指示します。FireOS 5および6では以下のようになります。adb shell am startservice -a "transient" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
Fire OS 7(Android Oreo以降)では以下のとおりです。
adb shell am start-foreground-service -a "transient" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
想定される動作:
Duck持続時間ヒント
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
を使用してオーディオフォーカスをリクエストするようツールに指示します。FireOS 5および6では以下のようになります。adb shell am startservice -a "duck" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
Fire OS 7(Android Oreo以降)では以下のとおりです。
adb shell am start-foreground-service -a "duck" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
想定される動作:
Releaseオーディオフォーカスを破棄するようツールに指示します。Fire OS 5および6では以下のようになります。
adb shell am startservice -a "release" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
Fire OS 7(Android Oreo以降)では以下のとおりです。
adb shell am start-foreground-service -a "release" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
想定される動作:
すべてのアプリの動作は、マルチメディアアプリの要件に記載されている要件に準拠する必要があります。問題が発生する場合は、onAudioFocusChange()
コールバックの実装を確認します。