オーディオ プレーヤーは、特定のオーディオ ソースのルーティング、音量、フォーカスに関する決定をオーディオ システムがどのように行うかを定義する属性をサポートしています。アプリケーションは、音声再生(ストリーミング サービスで再生される音楽や新しいメールの通知音など)に属性を付与して、そのオーディオ ソースの属性をフレームワークに渡すことができます。フレームワークでは、オーディオ システムがこの属性を使用してミキシングに関する決定を行い、システムの状態についてアプリケーションに通知します。
Android 4.4 以前のフレームワークでは、オーディオのストリーム タイプのみを用いてミキシングに関する決定を行っていました。しかし、この種の決定をストリーム タイプに基づいて行う方式では、複数のアプリケーションとデバイス上で高品質の出力を生成することに限界がありました。たとえば、モバイル デバイスが 1 つであれば、複数のアプリケーション(Google マップなど)で STREAM_MUSIC ストリーム タイプを用いて運転ルートの音声を再生することが可能でした。しかし、プロジェクション モード(Android Auto など)で複数のデバイスを扱う場合、運転ルートの音声と他のメディア ストリームを混在させることができませんでした。
アプリケーションは、Audio Attribute API を使用して、特定のオーディオ ソースに関する詳細情報をオーディオ システムに提供します。属性には、用途(ソースが再生される理由)、コンテンツ タイプ(ソースが何を再生しているか)、フラグ(ソースの再生方法)、コンテキスト(Android 9 の新機能)があります。構文は以下のとおりです。
AudioAttributes {
    mUsage
    mContentType
    mSource
    mFlags
    mTags / mFormattedTags / mBundle    (key value pairs)
}- 用途。ソースが再生される理由を指定します。また、ルーティング、フォーカス、音量に関する決定を制御します。
 - コンテンツ タイプ。ソースが何を再生するか(音楽、動画、話し声、ソニフィケーション、不明)を指定します。
 - コンテキスト。オーディオ HAL に抽象化された用途に関する値。
 - フラグ。ソースの再生方法を指定します。 可聴性の強化(一部の国で必須のカメラのシャッター音)や、ハードウェアのオーディオ / ビデオ同期のサポートも指定できます。
 
ダイナミクス処理では、アプリケーションが動画、音楽、話し声の各コンテンツを区別する必要があります。音量やピークサンプル値など、データそのものに関する情報が重要になることもあります。
属性を使用する
用途は、ストリームが使用されるコンテキストを指定します。これにより、音声の再生理由と用途に関する情報が提供されます。用途は、ストリーム タイプよりも多くの情報を表現します。プラットフォームやルーティング ポリシーで、音量やルーティングに関する決定を調整できます。
任意のインスタンスで、次のいずれかの用途に関する値を指定します。
- USAGE_UNKNOWN
 - USAGE_MEDIA
 - USAGE_VOICE_COMMUNICATION
 - USAGE_VOICE_COMMUNICATION_SIGNALLING
 - USAGE_ALARM
 - USAGE_NOTIFICATION
 - USAGE_NOTIFICATION_TELEPHONY_RINGTONE
 - USAGE_NOTIFICATION_COMMUNICATION_REQUEST
 - USAGE_NOTIFICATION_COMMUNICATION_INSTANT
 - USAGE_NOTIFICATION_COMMUNICATION_DELAYED
 - USAGE_NOTIFICATION_EVENT
 - USAGE_ASSISTANCE_ACCESSIBILITY
 - USAGE_ASSISTANCE_NAVIGATION_GUIDANCE
 - USAGE_ASSISTANCE_SONIFICATION
 - USAGE_GAME
 - USAGE_VIRTUAL_SOURCE
 - USAGE_ASSISTANT
 
  オーディオ属性の用途に関する値は相互に排他的です。例については、USAGE_MEDIA および USAGE_ALARM の定義を参照してください。例外については、AudioAttributes.Builder の定義を参照してください。
コンテンツ タイプ
  コンテンツ タイプは、音声が何であるかを定義します。動画、話し声、ビープ音、着信音など、コンテンツの一般的カテゴリを表します。オーディオ フレームワークがコンテンツ タイプに関する情報を使用して、オーディオの後処理ブロックを選択的に構成します。コンテンツ タイプの指定は任意ですが、コンテンツ タイプがわかっている場合(動画配信サービスであれば CONTENT_TYPE_MOVIE、音楽再生アプリであれば CONTENT_TYPE_MUSIC)には、コンテンツ タイプに関する情報を含める必要があります。
任意のインスタンスで、次のいずれかのコンテンツ タイプに関する値を指定します。
CONTENT_TYPE_UNKNOWN(デフォルト)CONTENT_TYPE_MOVIECONTENT_TYPE_MUSICCONTENT_TYPE_SONIFICATIONCONTENT_TYPE_SPEECH
オーディオ属性のコンテンツ タイプに関する値は相互に排他的です。コンテンツ タイプの詳細については、Audio Attribute API をご覧ください。
コンテキスト
  Android の各音声は、関連するアプリケーションの種類や、音声が生成された理由に基づいて識別されます。Android デバイスでは、この情報を使用して、音声の提供方法が決定されます。Android 8.x 以前では、アプリケーションは従来のストリーム タイプ(AudioSystem.STREAM_MUSIC など)や AudioAttributes を使用して、音声が生成された理由を報告できます。Android 9 では、AudioAttributes.usage 値は HAL レベルでコンテキストとして抽象化されます。
| HAL オーディオ コンテキスト | AudioAttributes の用途 | 
|---|---|
| MUSIC | MEDIA | 
| VOICE_COMMAND | USAGE_ASSISTANT | 
| NAVIGATION | ASSISTANCE_NAVIGATION_GUIDANCE | 
| CALL | VOICE_COMMUNICATION | 
| RINGTONE | NOTIFICATION_RINGTONE | 
| NOTIFICATION | NOTIFICATION | 
| ALARM | ALARM | 
| SYSTEM_SOUND | ASSISTANCE_SONIFICATION | 
| UNKNOWN | UNKNOWN | 
任意のインスタンスについて、以下のいずれかの CONTEXT_NUMBER の値を指定できます。
- MUSIC_CONTEXT // 音楽の再生
 - NAVIGATION_CONTEXT // 経路ナビゲーション
 - VOICE_COMMAND_CONTEXT // 音声コマンド セッション
 - CALL_RING_CONTEXT // 音声通話着信
 - CALL_CONTEXT // 音声通話
 - ALARM_CONTEXT // Android からのアラーム音
 - NOTIFICATION_CONTEXT // 通知
 - SYSTEM_SOUND_CONTEXT // ユーザーの操作音(ボタンのクリックなど)
 
フラグ
フラグは、オーディオの再生時にオーディオ フレームワークがどのようにエフェクトを適用するかを指定します。 インスタンスに以下のフラグを 1 つ以上指定します。
FLAG_AUDIBILITY_ENFORCED。音声の可聴性を確保するようシステムにリクエストします。以前のSTREAM_SYSTEM_ENFORCEDに関するニーズ(カメラのシャッター音の強制再生など)に対応するために使用します。HW_AV_SYNC。ハードウェアのオーディオ / ビデオ同期をサポートする出力ストリームを選択するようシステムにリクエストします。
オーディオ属性フラグは非排他的で、組み合わせることができます。これらのフラグの詳細については、Audio Attribute API をご覧ください。
例
この例では、新しい AudioTrack インスタンスによって使用される AudioAttributes を AudioAttributes.Builder が定義します。
AudioTrack myTrack = new AudioTrack(
  new AudioAttributes.Builder()
 .setUsage(AudioAttributes.USAGE_MEDIA)
    .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
    .build(),
  myFormat, myBuffSize, AudioTrack.MODE_STREAM, mySession);互換性
アプリケーションのデベロッパーは、Android 5.0 以降向けにアプリケーションを作成および更新する際、オーディオ属性を使用する必要があります。ただし、アプリケーションで属性のメリットを活用する必要はありません。従来のストリーム タイプのみを処理するようにすることも、再生中のコンテンツについての情報を一切取得しない通常のメディア プレーヤーとしてアプリケーションを作成するなど、属性を認識しないようにすることもできます。
このような場合には、フレームワークにより従来のオーディオ ストリーム タイプがオーディオ属性に自動的に変換されます。これにより、古いデバイスおよび古い Android リリースとの下位互換性が維持されます。だたし、デバイス、メーカー、Android リリース全体でこのマッピングが強制または保証されることはありません。
互換性マッピング:
| Android 5.0 以降 | Android 4.4 以前 | 
|---|---|
  CONTENT_TYPE_SPEECHUSAGE_VOICE_COMMUNICATION
   | 
  
  STREAM_VOICE_CALL
   | 
  CONTENT_TYPE_SONIFICATIONUSAGE_ASSISTANCE_SONIFICATION
   | 
  
  STREAM_SYSTEM
   | 
  CONTENT_TYPE_SONIFICATIONUSAGE_NOTIFICATION_RINGTONE
   | 
  
  STREAM_RING
   | 
  CONTENT_TYPE_MUSICUSAGE_UNKNOWNUSAGE_MEDIAUSAGE_GAMEUSAGE_ASSISTANCE_ACCESSIBILITYUSAGE_ASSISTANCE_NAVIGATION_GUIDANCE
   | 
  
  STREAM_MUSIC
   | 
  CONTENT_TYPE_SONIFICATIONUSAGE_ALARM
   | 
  
  STREAM_ALARM
   | 
  CONTENT_TYPE_SONIFICATIONUSAGE_NOTIFICATIONUSAGE_NOTIFICATION_COMMUNICATION_REQUESTUSAGE_NOTIFICATION_COMMUNICATION_INSTANTUSAGE_NOTIFICATION_COMMUNICATION_DELAYEDUSAGE_NOTIFICATION_EVENT
   | 
  
  STREAM_NOTIFICATION
   | 
  CONTENT_TYPE_SPEECH
   | 
  (@hide) STREAM_BLUETOOTH_SCO | 
  FLAG_AUDIBILITY_ENFORCED
   | 
  (@hide) STREAM_SYSTEM_ENFORCED | 
  CONTENT_TYPE_SONIFICATIONUSAGE_VOICE_COMMUNICATION_SIGNALLING
   | 
  (@hide) STREAM_DTMF | 
非推奨のストリーム タイプ
Android 9 では、自動車向けの以下のストリーム タイプが非推奨になりました。
- STREAM_DEFAULT
 - STREAM_VOICE_CALL
 - STREAM_SYSTEM
 - STREAM_RING
 - STREAM_MUSIC
 - STREAM_ALARM
 - STREAM_NOTIFICATION
 - STREAM_BLUETOOTH_SCO
 - STREAM_SYSTEM_ENFORCED
 - STREAM_DTMF
 - STREAM_TTS
 - STREAM_ACCESSIBILITY
 
詳細については、自動車用オーディオをご覧ください。