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