ผู้ใช้คาดหวังว่าจะควบคุมระดับเสียงของแอปเสียงได้ ลักษณะการทํางานมาตรฐานรวมถึงความสามารถในการใช้ตัวควบคุมระดับเสียง (ปุ่มหรือปุ่มหมุนบนอุปกรณ์หรือแถบเลื่อนใน 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 จะผสมสตรีมเสียงทั้งหมดประเภทเดียวกันเข้าด้วยกัน
วิธีเหล่านี้จะเปลี่ยนระดับเสียงของแอปทุกแอปที่ใช้สตรีม หลีกเลี่ยงการใช้ข้อความต่อไปนี้
adjustStreamVolume()
adjustSuggestedStreamVolume()
adjustVolume()
setStreamVolume() setStreamVolume()
setStreamSolo()
setStreamMute()
การทำงานกับอุปกรณ์ที่มีระดับเสียงคงที่
อุปกรณ์บางเครื่อง (เช่น 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); } }