การจัดการการเปลี่ยนแปลงในเอาต์พุตเสียง

ผู้ใช้คาดหวังว่าจะควบคุมระดับเสียงของแอปเสียงได้ ลักษณะการทํางานมาตรฐานรวมถึงความสามารถในการใช้ตัวควบคุมระดับเสียง (ปุ่มหรือปุ่มหมุนบนอุปกรณ์หรือแถบเลื่อนใน UI) และหลีกเลี่ยงการเล่นเสียงดังขึ้นอย่างฉับพลันหากอุปกรณ์ต่อพ่วง เช่น หูฟัง ถูกถอดออกขณะใช้งาน

การใช้ตัวควบคุมระดับเสียง

เมื่อผู้ใช้กดปุ่มปรับระดับเสียงในแอปเกมหรือแอปเพลง ระดับเสียงควรเปลี่ยนแปลง แม้ว่าโปรแกรมเล่นจะหยุดชั่วคราวระหว่างเพลงหรือไม่มีเพลงสำหรับตำแหน่งปัจจุบันของเกม

Android ใช้สตรีมเสียงแยกต่างหากสำหรับการเล่นเพลง การปลุก การแจ้งเตือน เสียงเรียกเข้า เสียงของระบบ ระดับเสียงระหว่างโทร และเสียง DTMF ซึ่งจะช่วยให้ผู้ใช้ควบคุมระดับเสียงของสตรีมแต่ละรายการแยกกันได้

โดยค่าเริ่มต้น การกดตัวควบคุมระดับเสียงจะแก้ไขระดับเสียงของสตรีมเสียงที่ใช้งานอยู่ หากแอปไม่ได้เล่นอะไรอยู่ การกดปุ่มปรับระดับเสียงจะปรับระดับเสียงเพลง (หรือระดับเสียงการปลุกก่อน Android 9)

คุณควรเล่นเสียงเมื่อมีการใช้งาน AudioAttributes.USAGE_MEDIA เว้นแต่แอปจะเป็นนาฬิกาปลุก

คุณควรเรียกใช้ setVolumeControlStream() โดยส่งผ่านประเภทสตรีมที่ตรงกับแอตทริบิวต์ที่คุณดึงมาจาก AudioAttributes.getVolumeControlStream เพื่อให้แน่ใจว่าตัวควบคุมระดับเสียงจะปรับสตรีมที่ต้องการ

Kotlin

setVolumeControlStream(AudioManager.STREAM_MUSIC)

Java

setVolumeControlStream(AudioManager.STREAM_MUSIC);

เรียกใช้เมธอดนี้ในวงจรชีวิตของแอป โดยปกติแล้วจากonResume() เมธอดของกิจกรรมหรือส่วนที่ควบคุมสื่อ ซึ่งจะเชื่อมต่อการควบคุมระดับเสียงกับ STREAM_MUSIC ทุกครั้งที่กิจกรรมหรือส่วนที่เป็นเป้าหมายแสดงอยู่

การควบคุมระดับเสียงสตรีมแบบเป็นโปรแกรม

ในบางกรณีที่พบไม่บ่อยนัก คุณสามารถตั้งค่าระดับเสียงของสตรีมเสียงแบบเป็นโปรแกรมได้ เช่น เมื่อแอปแทนที่ UI ที่มีอยู่ เราไม่แนะนําวิธีนี้เนื่องจากAudioManagerของ Android จะผสมสตรีมเสียงทั้งหมดประเภทเดียวกันเข้าด้วยกัน วิธีเหล่านี้จะเปลี่ยนระดับเสียงของแอปทุกแอปที่ใช้สตรีม หลีกเลี่ยงการใช้ข้อความต่อไปนี้

การทำงานกับอุปกรณ์ที่มีระดับเสียงคงที่

อุปกรณ์บางเครื่อง (เช่น Chromebook และรถยนต์ที่ใช้ระบบปฏิบัติการ Android Automotive) มีการควบคุมระดับเสียง แต่ไม่อนุญาตให้แอปใช้AudioManagerวิธีการที่อธิบายไว้ก่อนหน้านี้เพื่อเปลี่ยนระดับของสตรีมเสียง อุปกรณ์เหล่านี้เรียกว่าอุปกรณ์ระดับเสียงคงที่ คุณสามารถดูว่าแอปทำงานบนอุปกรณ์ที่มีระดับเสียงคงที่หรือไม่โดยเรียกใช้ isVolumeFixed()

แอปเสียงควรมีความสามารถในการปรับสมดุลระดับเสียงเอาต์พุตของแอปกับแอปอื่นๆ ที่อาจเล่นในสตรีมเดียวกัน ในอุปกรณ์ระดับเสียงคงที่ แอปควรเชื่อมต่อตัวควบคุมระดับเสียงของตัวเองกับsetVolume()เมธอดที่เหมาะสม ดังนี้

ผู้เล่น วิธีการ
AudioTrack AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer ใช้ SimpleExoPlayer.setVolume() ซึ่งจะตั้งค่าระดับเสียงของ AudioTrack ที่เกี่ยวข้อง
เว็บ ตั้งค่าพร็อพเพอร์ตี้ volume ของ HTMLMediaElement

อย่าส่งเสียงดัง

ผู้ใช้มีทางเลือกมากมายในการเพลิดเพลินกับเสียงจากอุปกรณ์ Android อุปกรณ์ส่วนใหญ่มีลำโพงในตัว แจ็คหูฟังสำหรับชุดหูฟังแบบใช้สาย และอุปกรณ์จำนวนมากยังมีการเชื่อมต่อบลูทูธและรองรับเสียง A2DP ด้วย

เมื่อถอดชุดหูฟังออกหรือยกเลิกการเชื่อมต่ออุปกรณ์บลูทูธ สตรีมเสียงจะเปลี่ยนเส้นทางไปยังลำโพงในตัวโดยอัตโนมัติ หากคุณฟังเพลงที่ระดับเสียงดัง ฟีเจอร์นี้อาจทำให้คุณตกใจ

ผู้ใช้มักจะคาดหวังว่าแอปที่มีโปรแกรมเล่นเพลงพร้อมตัวควบคุมการเล่นบนหน้าจอจะหยุดเล่นชั่วคราวในกรณีนี้ ส่วนแอปอื่นๆ เช่น เกมที่ไม่มีการควบคุม ควรเล่นต่อไป ผู้ใช้สามารถปรับระดับเสียงด้วยตัวควบคุมฮาร์ดแวร์ของอุปกรณ์

เมื่อเอาต์พุตเสียงเปลี่ยนกลับไปเป็นลำโพงในตัว ระบบจะออกอากาศACTION_AUDIO_BECOMING_NOISY Intent คุณควรสร้าง BroadcastReceiver ที่คอยฟัง Intent นี้ทุกครั้งที่คุณเล่นเสียง ตัวรับควรมีลักษณะดังนี้

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
      }
    }
}

ลงทะเบียนรีซีฟเวอร์เมื่อเริ่มเล่น และยกเลิกการลงทะเบียนเมื่อหยุดเล่น หากคุณออกแบบแอปตามที่อธิบายไว้ในคู่มือนี้ การเรียกใช้เหล่านี้ควรปรากฏใน Callback ของเซสชันสื่อ 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);
  }
}