音声出力の変更の処理

ユーザーはオーディオ アプリの音量を調整できることを期待しています。標準的な動作 には音量コントロール(デバイス上のボタンまたはつまみ)を ユーザー インターフェースのデバイスやスライダーなど)に移動しないでください。また、ユーザーが ヘッドフォンなどの周辺機器が使用中に接続されていない。

音量コントロールの使用

ユーザーがゲームアプリや音楽アプリで音量ボタンを押すと、音量が調整されます 曲の合間にプレーヤーが一時停止している場合や、 現在地のゲームの場所が表示されます。

Android では、音楽、アラーム、音楽の再生に別々の音声ストリームを使用します。 通知、着信着信音、システム音、通話音量、DTMF 調整します。これにより、ユーザーは各ストリームの音量を個別に制御できます。

デフォルトでは、音量コントロールを押すと再生中の音声の音量が変更されます 。アプリで現在何も再生していない場合は、音量ボタンを押します。 音楽の音量(Android 9 より前の場合は着信音の音量)を調節する

目覚まし時計以外のアプリの場合、用途に合わせて音声を再生する AudioAttributes.USAGE_MEDIA

音量調節を 呼び出します。 setVolumeControlStream() 取得できる属性に一致するストリーム タイプを渡します。 AudioAttributes.getVolumeControlStream

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

この呼び出しは、アプリのライフサイクル(通常は onResume() から)で行います。 メソッドを呼び出せます。これにより、 ターゲット アクティビティまたはフラグメントがSTREAM_MUSIC 表示されます。

プログラムによるストリーム音量の制御

使う機会はまれですが、音声ストリームの音量をプログラムで設定できます。対象 たとえば、アプリで既存の UI を置き換える場合です。この方法は推奨されません。理由は次のとおりです。 Android AudioManager は、同じタイプのすべてのオーディオ ストリームをミキシングします。 以下のメソッドでは、そのストリームを使用するすべてのアプリの音量が変更されます。使用を避けるべき表現: できます。

固定音量デバイスへの対応

一部のデバイス(Chromebook など)には音量調節機能があるが、アプリで AudioManager を使用できない メソッドを使用し、音声ストリームのレベルを変更します。これらは 固定音量デバイスの場合。P-MAX キャンペーンと isVolumeFixed() を呼び出して、アプリが固定音量デバイスで実行されている。

オーディオ アプリでは、バランスのとれる機能を提供する必要があります 同じストリームで再生している他のアプリとの間で出力音量を調整する必要があります。 固定音量デバイスでは、アプリは独自の音量コントロールを 適切な setVolume() メソッドを使用します。

選手 メソッド
AudioTrack AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer 基礎となる AudioTrack の音量を設定する SimpleExoPlayer.setVolume() を使用します。

突然の大音量再生の防止

別の方法で音楽を楽しむには、 Android デバイスを管理しています。ほとんどのデバイスにはスピーカーが内蔵されており、 Bluetooth 接続や Bluetooth 対応の Bluetooth 対応ヘッドセットも A2DP オーディオ。

ヘッドセットを外したり Bluetooth デバイスの接続を解除したりすると、音声ストリームは 内蔵スピーカーへのルートを自動的に変更できます。高音で音楽を聴いている場合 不自然な点もあるでしょう

ユーザーは通常、画面上で再生できる音楽プレーヤーを含むアプリを期待します コントロールを使用して再生を一時停止します。その他のアプリ(ゲームなど) 再生を続行できます。ユーザーは デバイスのハードウェア コントロールによって制御されます。

音声出力が内蔵スピーカーに切り替わると、システムが ACTION_AUDIO_BECOMING_NOISY をブロードキャストします。 使用します。BroadcastReceiver を作成する。 このインテントをリッスンします。レシーバは次のようになります。

Kotlin

private class BecomingNoisyReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == AudioManager.ACTION_AUDIO_BECOMING_NOISY) {
            // Pause the playback
        }
    }
}

Java

private class BecomingNoisyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
      if (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) {
          // Pause the playback
      }
    }
}

再生の開始時にレシーバーを登録し、再生を停止したときに登録を解除します。 このガイドで説明するようにアプリを設計すると、これらの呼び出しは onPlay()onStop() のメディア セッション コールバック内で指定します。

Kotlin

private val intentFilter = IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY)
private val myNoisyAudioStreamReceiver = BecomingNoisyReceiver()

private val callback = object : MediaSessionCompat.Callback() {

    override fun onPlay() {
        registerReceiver(myNoisyAudioStreamReceiver, intentFilter)
    }

    override fun onStop() {
        unregisterReceiver(myNoisyAudioStreamReceiver)
    }
}

Java

private IntentFilter intentFilter = new IntentFilter(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
private BecomingNoisyReceiver myNoisyAudioStreamReceiver = new BecomingNoisyReceiver();

MediaSessionCompat.Callback callback = new
MediaSessionCompat.Callback() {
  @Override
  public void onPlay() {
    registerReceiver(myNoisyAudioStreamReceiver, intentFilter);
  }

  @Override
  public void onStop() {
    unregisterReceiver(myNoisyAudioStreamReceiver);
  }
}