เอกสารนี้ครอบคลุม 2 ด้านที่อาจเกิดข้อผิดพลาด
รัฐ เมื่อใช้ "Medialayer" การดำเนินการบางอย่างจะใช้ได้เฉพาะในสถานะบางอย่างเท่านั้น การดำเนินการที่ไม่ถูกต้องอาจทำให้เกิดข้อยกเว้นหรือลักษณะการทำงานที่ไม่คาดคิด
ทรัพยากร เมื่อทําการเปลี่ยนแปลงการกําหนดค่า เช่น การหมุนหน้าจอ คุณต้องปล่อยออบเจ็กต์
MediaPlayer
เพื่อเพิ่มพื้นที่ว่างในทรัพยากรของระบบและหลีกเลี่ยงการหมดทรัพยากร
จัดการสถานะ
MediaPlayer
อิงตามสถานะ กล่าวคือ มีสถานะภายในที่คุณต้องคำนึงถึงเสมอเมื่อเขียนโค้ด เนื่องจากการดำเนินการบางอย่างจะถูกต้องก็ต่อเมื่อผู้เล่นอยู่ในสถานะหนึ่งๆ หากคุณดำเนินการขณะอยู่ในสถานะที่ไม่ถูกต้อง ระบบอาจแสดงข้อยกเว้นหรือทําให้ระบบทำงานผิดพลาด
แผนภาพสถานะในเอกสารประกอบของคลาส MediaPlayer
จะชี้แจงว่าเมธอดใดที่ย้าย MediaPlayer
จากสถานะหนึ่งไปยังอีกสถานะหนึ่ง เช่น
- เมื่อคุณสร้าง
MediaPlayer
ใหม่MediaPlayer
ดังกล่าวจะอยู่ในสถานะไม่มีการใช้งาน - คุณสามารถเริ่มต้นได้โดยการเรียกใช้
setDataSource()
ซึ่งจะเปลี่ยนสถานะเป็นเริ่มต้นแล้ว - คุณเตรียมโดยใช้เมธอด
prepare()
หรือprepareAsync()
- เมื่อ
MediaPlayer
เตรียมพร้อมแล้ว ก็จะเข้าสู่สถานะPrepared
ซึ่งหมายความว่าคุณจะเรียกใช้start()
เพื่อให้เล่นสื่อได้
เมื่อถึงจุดนั้น คุณจะสลับระหว่างสถานะ Started
,
Paused
และ PlaybackCompleted
ได้โดยเรียกใช้เมธอดต่างๆ เช่น start()
, pause()
และ seekTo()
เป็นต้น
อย่างไรก็ตาม เมื่อคุณเรียกใช้ stop()
คุณจะเรียกใช้ start()
ไม่ได้อีกจนกว่าจะเตรียม MediaPlayer
อีกครั้ง
อย่าลืมคำนึงถึงแผนภาพสถานะเสมอเมื่อเขียนโค้ดที่โต้ตอบกับออบเจ็กต์ MediaPlayer
เนื่องจากการเรียกเมธอดจากสถานะที่ผิดเป็นสาเหตุที่พบบ่อยของข้อบกพร่อง
ปล่อย MediaPlayer
MediaPlayer
อาจใช้ทรัพยากรระบบที่มีค่า ดังนั้น คุณจึงควรใช้ความระมัดระวังเพิ่มเติมเสมอเพื่อให้แน่ใจว่าคุณไม่ได้เก็บอินสแตนซ์ MediaPlayer
ไว้นานกว่าที่จำเป็น เมื่อดำเนินการเสร็จแล้ว คุณควรเรียกใช้ release()
เสมอเพื่อให้แน่ใจว่าระบบได้ปล่อยทรัพยากรทั้งหมดที่กําหนดไว้ให้กับ release()
ดังกล่าวแล้ว
ตัวอย่างเช่น หากคุณใช้ MediaPlayer
และกิจกรรมได้รับการเรียกใช้ onStop()
คุณต้องปล่อย MediaPlayer
เนื่องจากไม่มีเหตุผลที่จะเก็บไว้ในขณะที่กิจกรรมไม่ได้โต้ตอบกับผู้ใช้ (เว้นแต่คุณจะเล่นสื่อในเบื้องหลัง ซึ่งจะกล่าวถึงในส่วนถัดไป)
เมื่อกิจกรรมกลับมาดำเนินต่อหรือเริ่มใหม่ คุณจะต้องสร้าง MediaPlayer
ใหม่และเตรียมอีกครั้งก่อนเล่นต่อ
วิธีปล่อยและทำให้ MediaPlayer
ของคุณเป็นโมฆะมีดังนี้
Kotlin
mediaPlayer?.release()
mediaPlayer = null
Java
mediaPlayer.release();
mediaPlayer = null;
ตัวอย่างเช่น ลองพิจารณาปัญหาที่อาจเกิดขึ้นหากคุณลืมปล่อยMediaPlayer
เมื่อกิจกรรมหยุดลง แต่สร้างใหม่เมื่อกิจกรรมเริ่มขึ้นอีกครั้ง เมื่อผู้ใช้เปลี่ยนการวางแนวหน้าจอ (หรือเปลี่ยนการกำหนดค่าอุปกรณ์ด้วยวิธีอื่น) ระบบจะรีสตาร์ทกิจกรรมโดยค่าเริ่มต้น คุณอาจใช้ทรัพยากรของระบบทั้งหมดอย่างรวดเร็วเมื่อผู้ใช้หมุนอุปกรณ์ไปมาระหว่างแนวตั้งและแนวนอน เนื่องจากเมื่อเปลี่ยนการวางแนวแต่ละครั้ง คุณสร้าง MediaPlayer
ใหม่ที่ไม่ได้เผยแพร่
ดูข้อมูลเพิ่มเติมเกี่ยวกับการเริ่มรันไทม์ใหม่ได้ที่การจัดการการเปลี่ยนแปลงรันไทม์
คุณอาจสงสัยว่าจะเกิดอะไรขึ้นหากต้องการเล่น "สื่อในเบื้องหลัง" ต่อแม้ว่าผู้ใช้จะออกจากกิจกรรมแล้ว เช่นเดียวกับลักษณะการทํางานของแอปพลิเคชันเพลงในตัว ในกรณีนี้ สิ่งที่คุณต้องการคือ MediaPlayer
ที่ควบคุมโดยบริการตามที่อธิบายไว้ในส่วนถัดไป
ดูข้อมูลเพิ่มเติม
Jetpack Media3 เป็นโซลูชันที่แนะนำสำหรับการเล่นสื่อในแอป อ่านข้อมูลเพิ่มเติมเกี่ยวกับโซลูชันนี้
หน้าเหล่านี้ครอบคลุมหัวข้อเกี่ยวกับการบันทึก การจัดเก็บ และการเล่นเสียงและวิดีโอ