處理音訊輸出的變化

使用者希望能控制音訊應用程式的音量。標準行為 包括使用者能夠使用音量控制項 (按下裝置上的按鈕或旋鈕) 或滑桿) 的音量,同時避免在 使用耳機時,耳機等周邊裝置會中斷連線。

使用音量控制項

使用者在遊戲或音樂應用程式中按下音量鍵時,應調整音量 。 目前遊戲位置。

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」 方法,變更音訊串流等級。這些稱為 固定音量裝置。您可以確認 應用程式正在透過呼叫 isVolumeFixed() 在固定磁碟區裝置上執行。

音訊應用程式應提供平衡的能力 可能和同一個串流同時播放的其他應用程式輸出音量。 在固定音量裝置上,應用程式應將其本身的音量控制項連結至 適當的 setVolume() 方法,如下表所示:

球員 方法
音軌 AudioTrack.setVolume()
媒體播放器 MediaPlayer.setVolume()
ExoPlayer 使用 SimpleExoPlayer.setVolume() 設定基礎 AudioTrack 的音量。

不用吵雜

使用者可以透過多種其他方式享受 使用者的 Android 裝置大多數裝置都有內建喇叭、耳機插孔 有線耳機,其中許多設備也內建藍牙連線和 A2DP 音訊。

當耳機未接上電源或藍牙裝置連線中斷時,音訊串流 會自動重新轉送到內建喇叭。如果在高音量的情況下聽音樂 音量,這或許是很大的驚喜。

使用者通常會希望應用程式內含音樂播放器,並在螢幕上顯示音樂 目前可暫停播放的控制項其他應用程式,例如沒有這類功能的遊戲 包含控制選項,但音訊必須繼續播放使用者可以使用 影響裝置的硬體控制項

當音訊輸出切換回內建喇叭時,系統會廣播 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);
  }
}