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

ผู้ใช้คาดหวังว่าจะสามารถควบคุมระดับเสียงของแอปเสียงได้ ลักษณะการทำงานมาตรฐาน รวมถึงสามารถใช้ตัวควบคุมระดับเสียง (ปุ่มหรือปุ่มบน หรือแถบเลื่อนใน 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) มีการควบคุมระดับเสียงแต่ไม่อนุญาตให้แอปใช้ AudioManager ที่อธิบายไว้ข้างต้น เพื่อเปลี่ยนระดับของสตรีมเสียง ทั้งหมดนี้เรียกว่า ระดับเสียงคงที่ คุณจะดูได้ว่า แอปกำลังทำงานในอุปกรณ์ที่มีระดับเสียงคงที่โดยโทรไปที่ isVolumeFixed()

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

ผู้เล่น วิธีการ
แทร็กเสียง AudioTrack.setVolume()
MediaPlayer MediaPlayer.setVolume()
ExoPlayer ใช้ SimpleExoPlayer.setVolume() ซึ่งจะกำหนดระดับเสียงของ AudioTrack เบื้องหลัง

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

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

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

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

เมื่อเอาต์พุตเสียงเปลี่ยนกลับไปเป็นลำโพงในตัว ระบบจะประกาศ ACTION_AUDIO_BECOMING_NOISY Intent คุณควรสร้าง 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
      }
    }
}

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