使用者希望能控制音訊應用程式的音量。標準行為 包括使用者能夠使用音量控制項 (按下裝置上的按鈕或旋鈕) 或滑桿) 的音量,同時避免在 使用耳機時,耳機等周邊裝置會中斷連線。
使用音量控制項
使用者在遊戲或音樂應用程式中按下音量鍵時,應調整音量 。 目前遊戲位置。
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
會將所有相同類型的音訊串流混在一起。
這些方法可變更使用該串流的應用程式音量。避免使用
他們可以:
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
使用固定音量裝置
部分裝置 (例如 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); } }