オーディオフォーカスをテスト


オーディオフォーカスをテスト

オーディオを再生するアプリは、必ず再生時間と完全に一致した状態で、オーディオフォーカスの取得・解放を正確に行う必要があります。Fire TVにおけるマルチメディアアプリの要件に記載された内容に準拠しなければ、正常に動作するアプリとは見なされません。次のセクションでは、アプリの動作を検証する方法について説明します。

オーディオスタックのステータスを確認する

オーディオスタックの現在のステータスは、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.avodcom.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のUI

アプリでAudio Focus RequesterのUIを使用するには、次のようにします。

  1. 対象のアプリとAudio Focus Requesterツールの両方をデバイスにインストールします。
  2. Audio Focus Requesterツールを起動します。
  3. フォーカスリクエストとタイムアウトのパラメーターを設定します。
  4. [Finish setup and start timers] をクリックして、タイマーを起動することを確認します。
  5. 対象のアプリを起動して、再生を開始します。
  6. タイムアウトの有効期限が切れるのを待ちます。

コマンドラインを使用する

  1. 対象のアプリとオーディオフォーカスツールの両方をインストールします。
  2. アプリで再生を開始します。
  3. サービスcom.amazon.audiofocusrequester/.AudioFocusRequesterServiceにオーディオフォーカスをリクエストして中止するようインテントを送信します。

    次のインテントアクションがサポートされています。

    Permanent

    待機時間ヒントAUDIOFOCUS_GAINを使用してオーディオフォーカスをリクエストするようツールに指示します。

    adb shell am startservice -a "permanent" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    想定される動作:

    Transient

    待機時間ヒントAUDIOFOCUS_GAIN_TRANSIENTを使用してオーディオフォーカスをリクエストするようツールに指示します。

    adb shell am startservice -a "transient" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    想定される動作:

    Duck

    待機時間ヒントAUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCKを使用してオーディオフォーカスをリクエストするようツールに指示します。

    adb shell am startservice -a "duck" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    想定される動作

    Release

    オーディオフォーカスを中止するようツールに指示します。

    adb shell am startservice -a "release" -n "com.amazon.audiofocusrequester/.AudioFocusRequesterService"
    

    想定される動作

すべてのアプリの動作は、Fire TVにおけるマルチメディアアプリの要件に記載されている要件に準拠する必要があります。問題が発生する場合は、onAudioFocusChange()コールバックの実装を確認します。