แอปที่ใช้ com.google.android.exoplayer2
แบบสแตนด์อโลนอยู่ในขณะนี้
ไลบรารีและ androidx.media
ควรย้ายข้อมูลไปยัง androidx.media3
ใช้
สคริปต์การย้ายข้อมูลเพื่อย้ายข้อมูลไฟล์บิลด์ของ Gradle, Java และ
ไฟล์ต้นฉบับ Kotlin และไฟล์เลย์เอาต์ XML จาก ExoPlayer
2.19.1
ไปยัง AndroidX Media3 1.1.1
ภาพรวม
ก่อนย้ายข้อมูล โปรดอ่านหัวข้อต่อไปนี้เพื่อให้ทราบข้อมูลเพิ่มเติม ประโยชน์ของ API ใหม่, API ที่ต้องย้ายข้อมูล และข้อกำหนดเบื้องต้น ที่โปรเจ็กต์ของแอปควรเป็นไปตามที่กำหนด
เหตุผลที่ควรย้ายข้อมูลไปยัง Jetpack Media3
- นี่คือบ้านหลังใหม่ของ ExoPlayer ในขณะที่
com.google.android.exoplayer2
ปิดให้บริการแล้ว - เข้าถึง API โปรแกรมเล่นในคอมโพเนนต์/กระบวนการต่างๆ ด้วย
MediaBrowser
/MediaController
- ใช้ความสามารถเพิ่มเติมของ
MediaSession
และMediaController
API - โฆษณาความสามารถในการเล่นด้วยการควบคุมการเข้าถึงแบบละเอียด
- ลดความซับซ้อนของแอปโดยนำ
MediaSessionConnector
และPlayerNotificationManager
- เข้ากันได้แบบย้อนหลังกับ API ไคลเอ็นต์ที่เข้ากันได้กับสื่อ
(
MediaControllerCompat
/MediaBrowserCompat
/MediaMetadataCompat
)
Media API ที่จะย้ายข้อมูลไปยัง AndroidX Media3
- ExoPlayer และส่วนขยาย
ซึ่งรวมถึงโมดูลทั้งหมดของโปรเจ็กต์ ExoPlayer เดิม ยกเว้น โมดูล mediasession ที่เลิกใช้งานแล้ว แอปหรือโมดูลที่ขึ้นอยู่กับ แพ็กเกจในcom.google.android.exoplayer2
สามารถย้ายข้อมูลได้ด้วย สคริปต์การย้ายข้อมูล - MediaSessionConnector (ขึ้นอยู่กับ
androidx.media.*
แพ็กเกจ ราคาandroidx.media:media:1.4.3+
)
นำMediaSessionConnector
ออกและใช้androidx.media3.session.MediaSession
แทน - MediaBrowserServiceCompat (ขึ้นอยู่กับ
androidx.media.*
แพ็กเกจ ราคาandroidx.media:media:1.4.3+
)
ย้ายข้อมูลคลาสย่อยของandroidx.media.MediaBrowserServiceCompat
ไปยังandroidx.media3.session.MediaLibraryService
และโค้ดที่ใช้MediaBrowserCompat.MediaItem
ถึงandroidx.media3.common.MediaItem
- MediaBrowserCompat (ขึ้นอยู่กับ
android.support.v4.media.*
แพ็กเกจ ราคาandroidx.media:media:1.4.3+
)
ย้ายรหัสไคลเอ็นต์โดยใช้MediaBrowserCompat
หรือMediaControllerCompat
เพื่อใช้androidx.media3.session.MediaBrowser
กับandroidx.media3.common.MediaItem
สิ่งที่ต้องมีก่อน
ตรวจสอบว่าโปรเจ็กต์อยู่ภายใต้การควบคุมของแหล่งที่มา
ตรวจสอบว่าคุณเปลี่ยนกลับการเปลี่ยนแปลงที่ใช้เครื่องมือการย้ายข้อมูลที่ใช้สคริปต์ได้อย่างง่ายดาย หากยังไม่มีโปรเจ็กต์อยู่ภายใต้การควบคุมแหล่งที่มา ตอนนี้เป็นโอกาสที่ดี เป็นอย่างแรกเลย หากคุณไม่ต้องการทำด้วยเหตุผลใดก็ตาม ให้ สำเนาสำรองของโปรเจ็กต์ก่อนเริ่มการย้ายข้อมูล
อัปเดตแอป
เราขอแนะนำให้อัปเดตโปรเจ็กต์เพื่อใช้ ไลบรารี ExoPlayer เวอร์ชันล่าสุด และนำรายการ การเรียกไปยังวิธีการที่เลิกใช้งานแล้ว หากคุณต้องการ ใช้สคริปต์สำหรับการย้ายข้อมูล คุณจะต้องจับคู่ เวอร์ชันที่คุณกำลังอัปเดตด้วยเวอร์ชันที่สคริปต์จัดการ
เพิ่ม compileSdkVersion ของแอปเป็นอย่างน้อย 32
อัปเกรด Gradle และปลั๊กอิน Android Studio Gradle เป็นเวอร์ชันล่าสุด เวอร์ชันที่ใช้งานได้กับทรัพยากร Dependency ที่อัปเดตแล้วจากด้านบน สำหรับ อินสแตนซ์:
- เวอร์ชันปลั๊กอิน Android Gradle: 7.1.0
- เวอร์ชัน Gradle: 7.4
แทนที่คำสั่งการนำเข้าไวลด์การ์ดทั้งหมดที่ใช้ Asterix (*) และใช้คำสั่งการนำเข้าที่สมบูรณ์ในตัวเอง: ลบไวลด์การ์ด รายงานการนำเข้า และใช้ Android Studio เพื่อนำเข้ารูปแบบ คำสั่ง (F2 - Alt/Enter, F2 - Alt/Enter, ...)
ย้ายข้อมูลจาก
com.google.android.exoplayer2.PlayerView
ไปยังcom.google.android.exoplayer2.StyledPlayerView
ขั้นตอนนี้จำเป็น เพราะไม่มีองค์ประกอบที่เทียบเท่ากับcom.google.android.exoplayer2.PlayerView
ใน AndroidX Media3
ย้ายข้อมูล ExoPlayer พร้อมการรองรับสคริปต์
สคริปต์นี้อำนวยความสะดวกในการย้ายจาก com.google.android.exoplayer2
ไปยังฟิลด์
โครงสร้างแพ็กเกจและโมดูลใน androidx.media3
ใช้สคริปต์
การตรวจสอบความถูกต้องบางอย่างจะตรวจสอบโปรเจ็กต์และพิมพ์คำเตือนหากตรวจสอบไม่สำเร็จ
มิฉะนั้น ระบบจะใช้การแมปชั้นเรียนและแพ็กเกจที่เปลี่ยนชื่อแล้วใน
ของโปรเจ็กต์ Android Gradle ที่เขียนด้วย Java หรือ Kotlin
usage: ./media3-migration.sh [-p|-c|-d|-v]|[-m|-l [-x <path>] [-f] PROJECT_ROOT]
PROJECT_ROOT: path to your project root (location of 'gradlew')
-p: list package mappings and then exit
-c: list class mappings (precedence over package mappings) and then exit
-d: list dependency mappings and then exit
-l: list files that will be considered for rewrite and then exit
-x: exclude the path from the list of file to be changed: 'app/src/test'
-m: migrate packages, classes and dependencies to AndroidX Media3
-f: force the action even when validation fails
-v: print the exoplayer2/media3 version strings of this script
-h, --help: show this help text
การใช้สคริปต์การย้ายข้อมูล
ดาวน์โหลดสคริปต์การย้ายข้อมูลจากแท็กของโปรเจ็กต์ ExoPlayer ใน GitHub สอดคล้องกับเวอร์ชันที่คุณอัปเดตแอป
curl -o media3-migration.sh \ "https://raw.githubusercontent.com/google/ExoPlayer/r2.19.1/media3-migration.sh"
ทำให้สคริปต์เป็นไฟล์ปฏิบัติการ ดังนี้
chmod 744 media3-migration.sh
เรียกใช้สคริปต์ด้วย
--help
เพื่อดูข้อมูลเกี่ยวกับตัวเลือกเรียกใช้สคริปต์ด้วย
-l
เพื่อแสดงรายการชุดไฟล์ที่เลือกไว้สำหรับ การย้ายข้อมูล (ใช้-f
เพื่อบังคับให้ข้อมูลโดยไม่มีคำเตือน):./media3-migration.sh -l -f /path/to/gradle/project/root
เรียกใช้สคริปต์ด้วย
-m
เพื่อแมปแพ็กเกจ ชั้นเรียน และโมดูลกับ Media3 การเรียกใช้สคริปต์ด้วยตัวเลือก-m
จะนำการเปลี่ยนแปลงไปใช้กับรายการที่เลือกไว้- หยุดจากข้อผิดพลาดการตรวจสอบความถูกต้องโดยไม่ทำการเปลี่ยนแปลง
./media3-migration.sh -m /path/to/gradle/project/root
- การบังคับการดำเนินการ
หากสคริปต์พบการละเมิดข้อกำหนดเบื้องต้น การย้ายข้อมูลอาจ บังคับด้วยแฟล็ก
-f
:./media3-migration.sh -m -f /path/to/gradle/project/root
# list files selected for migration when excluding paths
./media3-migration.sh -l -x "app/src/test/" -x "service/" /path/to/project/root
# migrate the selected files
./media3-migration.sh -m -x "app/src/test/" -x "service/" /path/to/project/root
ทำตามขั้นตอนเหล่านี้หลังจากเรียกใช้สคริปต์ด้วยตัวเลือก -m
:
- ตรวจสอบว่าสคริปต์เปลี่ยนแปลงโค้ดของคุณอย่างไร: ใช้เครื่องมือความแตกต่างและแก้ไข
ปัญหาที่อาจเกิดขึ้น (ลองยื่นข้อบกพร่อง หากคุณคิดว่าสคริปต์มีปัญหา
ปัญหาทั่วไปที่เกิดขึ้นโดยไม่ส่งตัวเลือก
-f
) - สร้างโปรเจ็กต์: ใช้
./gradlew clean build
หรือใน Android Studio เลือก ไฟล์ > ซิงค์โปรเจ็กต์กับไฟล์ Gradle ตามด้วย Build > ล้างโปรเจ็กต์ แล้วเลือกสร้าง > สร้างโปรเจ็กต์ใหม่ (ตรวจสอบบิลด์ใน 'Build - Build Output' แท็บของ Android Studio
ขั้นตอนติดตามผลที่แนะนำ
- แก้ไขการเลือกแสดงข้อผิดพลาดเกี่ยวกับการใช้ API ที่ไม่เสถียร
- แทนที่การเรียก API ที่เลิกใช้งานแล้ว: ใช้ API ทดแทนที่แนะนำ วางเมาส์ไว้เหนือคำเตือนใน Android Studio และอ่าน JavaDoc ของสัญลักษณ์ที่เลิกใช้งานแล้วเพื่อดูสิ่งที่จะใช้แทนการเรียกที่ระบุ
- จัดเรียงคำสั่งการนำเข้า: เปิดโปรเจ็กต์ใน Android Studio จากนั้น คลิกขวาที่โหนดโฟลเดอร์แพ็กเกจในโปรแกรมดูโปรเจ็กต์และเลือก เพิ่มประสิทธิภาพการนำเข้าในแพ็กเกจที่มีไฟล์แหล่งที่มาที่เปลี่ยนแปลง
แทนที่ MediaSessionConnector
ด้วย androidx.media3.session.MediaSession
ในโลก MediaSessionCompat
แบบเดิม MediaSessionConnector
คือ
รับผิดชอบการซิงค์สถานะของโปรแกรมเล่นกับสถานะของเซสชัน
และรับคำสั่งจากผู้ควบคุมข้อมูลซึ่งจำเป็นต้องมอบสิทธิ์
เมธอดของโปรแกรมเล่น เมื่อใช้ AndroidX Media3 การดำเนินการนี้ดำเนินการโดย MediaSession
โดยตรง
โดยไม่ต้องใช้เครื่องมือเชื่อมต่อ
นำการอ้างอิงและการใช้งาน MediaSessionConnector ทั้งหมดออก: หากคุณใช้ สคริปต์อัตโนมัติในการย้ายข้อมูลคลาสและแพ็กเกจ ExoPlayer จากนั้น น่าจะทำให้โค้ดของคุณอยู่ในสถานะที่ไม่สามารถคอมไพล์ได้เกี่ยวกับ
MediaSessionConnector
ที่ไม่สามารถแก้ไขได้ Android Studio จะ แสดงโค้ดเสียเมื่อพยายามสร้างหรือเริ่มแอปในไฟล์
build.gradle
ที่คุณรักษาการขึ้นต่อกัน ให้เพิ่ม การใช้ทรัพยากร Dependency ของโมดูลเซสชัน AndroidX Media3 และนําออก Dependency เดิมimplementation "androidx.media3:media3-session:1.4.0"
แทนที่
MediaSessionCompat
ด้วยandroidx.media3.session.MediaSession
ในเว็บไซต์โค้ดซึ่งคุณสร้าง
MediaSessionCompat
เดิมไว้ ให้ใช้androidx.media3.session.MediaSession.Builder
เพื่อสร้างMediaSession
ส่งโปรแกรมเล่น เพื่อสร้างเครื่องมือสร้างเซสชันval player = ExoPlayer.Builder(context).build() mediaSession = MediaSession.Builder(context, player) .setSessionCallback(MySessionCallback()) .build()
ใช้งาน
MySessionCallback
ตามที่แอปกำหนด โดยคุณจะทำขั้นตอนนี้หรือไม่ก็ได้ ถ้า คุณต้องการอนุญาตให้ตัวควบคุมเพิ่มรายการสื่อ ไปยังโปรแกรมเล่นMediaSession.Callback.onAddMediaItems()
ให้บริการที่หลากหลาย เมธอด API แบบเดิมที่เพิ่มรายการสื่อไปยังโปรแกรมเล่นวิดีโอสำหรับการเล่นใน ที่เข้ากันได้แบบย้อนหลัง ซึ่งรวมถึงMediaController.set/addMediaItems()
เมธอดของตัวควบคุม Media3 เป็น และTransportControls.prepareFrom*/playFrom*
ของ API เดิม ตัวอย่างการใช้งานonAddMediaItems
สามารถ ได้ในPlaybackService
ของแอปเดโมเซสชันปล่อยเซสชันสื่อในเว็บไซต์โค้ดที่คุณทำลายเซสชันของคุณ ก่อนการย้ายข้อมูล
mediaSession?.run { player.release() release() mediaSession = null }
ฟังก์ชัน MediaSessionConnector
ใน Media3
ตารางต่อไปนี้แสดง Media3 API ที่จัดการฟังก์ชันการทำงาน
ใช้ก่อนหน้านี้ใน MediaSessionConnector
MediaSessionConnector | AndroidX Media3 |
---|---|
CustomActionProvider |
MediaSession.Callback.onCustomCommand()/
MediaSession.setCustomLayout() |
PlaybackPreparer |
MediaSession.Callback.onAddMediaItems()
(prepare() เรียกว่าภายใน)
|
QueueNavigator |
ForwardingPlayer |
QueueEditor |
MediaSession.Callback.onAddMediaItems() |
RatingCallback |
MediaSession.Callback.onSetRating() |
PlayerNotificationManager |
DefaultMediaNotificationProvider/
MediaNotification.Provider |
ย้ายข้อมูล MediaBrowserService
ไปยัง MediaLibraryService
AndroidX Media3 เปิดตัว MediaLibraryService
ที่มาแทนที่
MediaBrowserServiceCompat
JavaDoc ของ MediaLibraryService
และขั้นสูง
คลาส MediaSessionService
จะให้ข้อมูลเบื้องต้นที่ดีเกี่ยวกับ API และ
โมเดลการเขียนโปรแกรมแบบไม่พร้อมกันของบริการ
MediaLibraryService
สามารถเข้ากันได้แบบย้อนหลังกับ
MediaBrowserService
แอปไคลเอ็นต์ที่ใช้ MediaBrowserCompat
หรือ
MediaControllerCompat
จะทำงานต่อไปโดยไม่มีการเปลี่ยนแปลงโค้ดเมื่อเชื่อมต่อ
เป็น MediaLibraryService
สำหรับลูกค้า เราเปิดเผยข้อมูลว่าแอปของคุณ
โดยใช้ MediaLibraryService
หรือ MediaBrowserServiceCompat
เดิม
![แผนภาพคอมโพเนนต์ของแอปพร้อมบริการ กิจกรรม และแอปภายนอก](https://developer.android.com/static/media/images/overview.png?authuser=19&hl=th)
คุณต้องลงทะเบียนบริการทั้ง 2 อย่างเพื่อให้สามารถใช้งานความเข้ากันได้แบบย้อนหลังได้ ใหม่กับบริการของคุณใน
AndroidManifest.xml
วิธีนี้ช่วยให้คุณ ลูกค้าพบบริการของคุณจากอินเทอร์เฟซบริการที่จำเป็น<service android:name=".MusicService" android:exported="true"> <intent-filter> <action android:name="androidx.media3.session.MediaLibraryService"/> <action android:name="android.media.browse.MediaBrowserService" /> </intent-filter> </service>
ในไฟล์
build.gradle
ที่คุณรักษาการขึ้นต่อกัน ให้เพิ่ม การใช้ทรัพยากร Dependency ในโมดูลเซสชัน AndroidX Media3 และ นำทรัพยากร Dependency เดิมออกimplementation "androidx.media3:media3-session:1.4.0"
เปลี่ยนบริการของคุณให้รับค่าจาก
MediaLibraryService
แทนMediaBrowserService
ดังที่กล่าวไว้ก่อนหน้านี้MediaLibraryService
สามารถทำงานร่วมกับMediaBrowserService
ดังนั้น API ที่กว้างขึ้นที่บริการ ที่เสนอให้ลูกค้ายังคงเดิม จึงมีแนวโน้มที่แอปสามารถ ตรรกะส่วนใหญ่ที่จำเป็นต่อการใช้MediaBrowserService
แล้วปรับให้เหมาะกับMediaLibraryService
ใหม่ความแตกต่างที่สำคัญเมื่อเทียบกับ
MediaBrowserServiceCompat
รายการ ได้แก่ใช้วิธีการเกี่ยวกับวงจรชีวิตของบริการ: วิธีการที่จำเป็นเพื่อ ในบริการคือ
onCreate/onDestroy
โดยที่ จัดสรร/เผยแพร่เซสชันไลบรารี โปรแกรมเล่น และอื่นๆ ที่ไม่ซับซ้อน นอกเหนือจากวิธีการในวงจรของบริการแบบมาตรฐานแล้ว แอป จำเป็นต้องลบล้างonGetSession(MediaSession.ControllerInfo)
เพื่อแสดงผลMediaLibrarySession
ที่สร้างขึ้นในonCreate
ติดตั้งใช้งาน MediaLibraryService.MediaLibrarySessionCallback: การสร้าง เซสชันต้องมี
MediaLibraryService.MediaLibrarySessionCallback
ที่นำไปใช้ เมธอด API ของโดเมนจริง ดังนั้นแทนที่จะลบล้างเมธอด API ของ บริการเดิม คุณจะลบล้างเมธอดของMediaLibrarySession.Callback
แทนจากนั้นระบบจะใช้ Callback เพื่อสร้าง
MediaLibrarySession
:mediaLibrarySession = MediaLibrarySession.Builder(this, player, MySessionCallback()) .build()
ค้นหา API แบบเต็มของ MediaLibrarySessionCallback ใน API เอกสารประกอบ
ใช้
MediaSession.Callback.onAddMediaItems()
: CallbackonAddMediaItems(MediaSession, ControllerInfo, List<MediaItem>)
ให้บริการ เมธอด API ต่างๆ ทั้งในปัจจุบันและแบบเดิมที่เพิ่มรายการสื่อไปยังโปรแกรมเล่น เพื่อการเล่นในแบบที่เข้ากันได้แบบย้อนหลัง ซึ่งรวมถึงMediaController.set/addMediaItems()
เมธอดของตัวควบคุม Media3 รวมถึงTransportControls.prepareFrom*/playFrom*
ของ API เดิม ตัวอย่างการใช้งาน Callback อาจทำได้ ได้ในPlaybackService
ของแอปเดโมเซสชันAndroidX Media3 กำลังใช้
androidx.media3.common.MediaItem
แทน ของ MediaBrowserCompat.MediaItem และ MediaMetadataCompat ชิ้นส่วน ของรหัสที่เชื่อมโยงกับชั้นเรียนเดิม จะต้องมีการเปลี่ยนแปลงให้สอดคล้องกัน หรือแมปกับMediaItem
Media3 แทนโมเดลการเขียนโปรแกรมแบบอะซิงโครนัสที่เปลี่ยนเป็น
Futures
ใน ตรงกันข้ามกับแนวทางResult
ที่ถอดออกได้ของMediaBrowserServiceCompat
การใช้งานบริการของคุณอาจแสดง ไม่พร้อมกันListenableFuture
แทนที่จะแยกผลลัพธ์หรือ แสดงผลค่า Future ทันทีเพื่อแสดงผลค่าโดยตรง
นำ PlayerNotificationManager ออก
MediaLibraryService
รองรับการแจ้งเตือนสื่อโดยอัตโนมัติ และ
คุณสามารถนำ PlayerNotificationManager
ออกได้เมื่อใช้ MediaLibraryService
หรือ
MediaSessionService
แอปสามารถปรับแต่งการแจ้งเตือนโดยการตั้งค่า
MediaNotification.Provider
ใน onCreate()
ที่แทนที่
DefaultMediaNotificationProvider
จากนั้น MediaLibraryService
จะดูแล
เริ่มต้นบริการในเบื้องหน้าตามที่จำเป็น
การลบล้าง MediaLibraryService.updateNotification()
จะทำให้แอปดำเนินการต่อไปได้
เป็นเจ้าของอย่างเต็มที่ในการโพสต์การแจ้งเตือน และการเริ่ม/หยุดบริการใน
เบื้องหน้าตามที่จําเป็น
ย้ายโค้ดไคลเอ็นต์โดยใช้ MediaBrowser
เมื่อใช้ AndroidX Media3 MediaBrowser
จะนำ MediaController/Player
ของ YouTube และสามารถใช้เพื่อควบคุมการเล่นสื่อนอกเหนือจากการเรียกดูสื่อ
ไลบรารี หากคุณต้องสร้าง MediaBrowserCompat
และ
MediaControllerCompat
ในโลกเดิม คุณสามารถทำแบบเดียวกันนี้ได้ด้วยการใช้
MediaBrowser
ใน Media3
สร้าง MediaBrowser
แล้วรอการเชื่อมต่อกับ
บริการที่ก่อตั้ง:
scope.launch {
val sessionToken =
SessionToken(context, ComponentName(context, MusicService::class.java)
browser =
MediaBrowser.Builder(context, sessionToken))
.setListener(BrowserListener())
.buildAsync()
.await()
// Get the library root to start browsing the library.
root = browser.getLibraryRoot(/* params= */ null).await();
// Add a MediaController.Listener to listen to player state events.
browser.addListener(playerListener)
playerView.setPlayer(browser)
}
ดูข้อมูลเกี่ยวกับ
ควบคุมการเล่นในเซสชันสื่อ
เพื่อดูวิธีสร้าง MediaController
สำหรับควบคุมการเล่นใน
พื้นหลัง
ขั้นตอนต่อไปและการล้างข้อมูล
ข้อผิดพลาดของ API ที่ไม่เสถียร
หลังจากย้ายข้อมูลไปยัง Media3 แล้ว คุณอาจเห็นข้อผิดพลาดเกี่ยวกับ Lint เกี่ยวกับการใช้ API ที่ไม่เสถียร
API เหล่านี้ใช้งานได้อย่างปลอดภัย และข้อผิดพลาดจาก Lint เป็นผลสืบเนื่องจาก
เพื่อรับประกันความเข้ากันได้กับไบนารี ถ้าไม่ใช้ไบนารีที่เข้มงวด
ความเข้ากันได้ ข้อผิดพลาดเหล่านี้สามารถระงับได้อย่างปลอดภัยด้วย @OptIn
หมายเหตุ
ฉากหลัง
ทั้ง ExoPlayer v1 หรือ v2 ไม่ได้ให้การรับประกันที่เข้มงวดเกี่ยวกับความเข้ากันได้ของไบนารี ระหว่างเวอร์ชันต่อๆ ไป แพลตฟอร์ม ExoPlayer API ด้วยการออกแบบขนาดใหญ่ เพื่อให้แอปสามารถกำหนดค่า การเล่น ExoPlayer ในเวอร์ชันต่อๆ มาจะเปิดตัวสัญลักษณ์ เปลี่ยนชื่อ หรือการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบ (เช่น เมธอดใหม่ๆ ที่จำเป็นในอินเทอร์เฟซ) ใน ในกรณีส่วนใหญ่ การหยุดทำงานเหล่านี้ลดลงได้โดยเปิดตัวสัญลักษณ์ใหม่ ควบคู่ไปกับการเลิกใช้งานสัญลักษณ์เดิมใน 2-3 เวอร์ชัน เพื่อให้นักพัฒนาซอฟต์แวร์ ในการย้ายข้อมูลการใช้งาน แต่นั่นเป็นไปไม่ได้เสมอไป
การเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบซึ่งก่อให้เกิดปัญหา 2 อย่างสำหรับผู้ใช้ ExoPlayer v1 และไลบรารี v2:
- การอัปเกรดจากเป็นเวอร์ชัน ExoPlayer อาจทำให้โค้ดหยุดคอมไพล์ได้
- แอปที่อาศัย ExoPlayer ทั้งโดยตรงและผ่านสื่อกลาง ต้องตรวจสอบว่าทรัพยากร Dependency ทั้ง 2 รายการเป็นเวอร์ชันเดียวกัน ไม่เช่นนั้นความไม่เข้ากันของไบนารีอาจส่งผลให้รันไทม์เกิดข้อขัดข้อง
การปรับปรุงใน Media3
Media3 รับประกันความเข้ากันได้แบบไบนารีสำหรับชุดย่อยของแพลตฟอร์ม API
ส่วนที่ไม่รับประกันความเข้ากันได้ของไบนารีจะมีเครื่องหมาย
@UnstableApi
และเพื่อให้เกิดความแตกต่างอย่างชัดเจนนี้ การใช้งานที่ไม่เสถียร
สัญลักษณ์ API จะสร้างข้อผิดพลาด Lint เว้นแต่ว่าจะมีคำอธิบายประกอบด้วย @OptIn
หลังจากย้ายข้อมูลจาก ExoPlayer v2 ไปยัง Media3 คุณอาจเห็น API ที่ไม่เสถียรจำนวนมาก ข้อผิดพลาด Lint ซึ่งอาจทำให้ดูเหมือนว่า Media3 มี "ความเสถียรน้อยกว่า" มากกว่า ExoPlayer เวอร์ชัน 2 ซึ่งจะไม่เป็นเช่นนั้น กฎ 'ไม่เสถียร' ของ Media3 API บางส่วนมี ระดับความเสถียรโดยรวมของแพลตฟอร์ม ExoPlayer v2 API และ การรับประกันแพลตฟอร์ม Media3 API ที่เสถียรไม่พร้อมใช้งานใน ExoPlayer v2 ที่ ทั้งหมด ความแตกต่างก็คือ ตอนนี้ข้อผิดพลาด Lint จะแจ้งเตือนให้คุณทราบถึง ระดับความเสถียร
จัดการข้อผิดพลาด Lint ใน API ที่ไม่เสถียร
ดูรายละเอียดเกี่ยวกับวิธีทำส่วนการแก้ปัญหาเกี่ยวกับข้อผิดพลาด Lint เหล่านี้
ใส่คำอธิบายประกอบการใช้ API ที่ไม่เสถียรของ Java และ Kotlin ด้วย @OptIn
API ที่เลิกใช้งานแล้ว
คุณอาจสังเกตเห็นว่าการเรียก API ที่เลิกใช้แล้วขัดข้องใน Android Studio เราขอแนะนำให้แทนที่การเรียกดังกล่าวด้วยทางเลือกที่เหมาะสม วางเมาส์เหนือสัญลักษณ์เพื่อดู JavaDoc ที่บอกให้ทราบว่าต้องใช้ API ใดแทน
![ภาพหน้าจอ: วิธีแสดง JavaDoc พร้อมทางเลือกของวิธีที่เลิกใช้แล้ว](https://developer.android.com/static/media/media3/exoplayer/images/deprecation.png?authuser=19&hl=th)
ตัวอย่างโค้ดและแอปเดโม
- แอปเดโมเซสชัน AndroidX Media3 (อุปกรณ์เคลื่อนที่และ WearOS)
- การทำงานที่กำหนดเอง
- การแจ้งเตือน UI ของระบบ, MediaButton/BT
- ตัวควบคุมการเล่นของ Google Assistant
- UAMP: Android Media Player (Branch media3) (อุปกรณ์เคลื่อนที่, AutomotiveOS)
- การแจ้งเตือน UI ของระบบ, MediaButton/BT, การกลับมาเล่นอีกครั้ง
- การควบคุมการเล่น Google Assistant/WearOS
- AutomotiveOS: คําสั่งที่กําหนดเองและการลงชื่อเข้าใช้