คำแนะนำในการย้ายข้อมูล AndroidX Media3

แอปที่ใช้ 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

สิ่งที่ต้องมีก่อน

  1. ตรวจสอบว่าโปรเจ็กต์อยู่ภายใต้การควบคุมของแหล่งที่มา

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

  2. อัปเดตแอป

    • เราขอแนะนำให้อัปเดตโปรเจ็กต์เพื่อใช้ ไลบรารี 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

การใช้สคริปต์การย้ายข้อมูล

  1. ดาวน์โหลดสคริปต์การย้ายข้อมูลจากแท็กของโปรเจ็กต์ ExoPlayer ใน GitHub สอดคล้องกับเวอร์ชันที่คุณอัปเดตแอป

    curl -o media3-migration.sh \
      "https://raw.githubusercontent.com/google/ExoPlayer/r2.19.1/media3-migration.sh"
    
  2. ทำให้สคริปต์เป็นไฟล์ปฏิบัติการ ดังนี้

    chmod 744 media3-migration.sh
    
  3. เรียกใช้สคริปต์ด้วย --help เพื่อดูข้อมูลเกี่ยวกับตัวเลือก

  4. เรียกใช้สคริปต์ด้วย -l เพื่อแสดงรายการชุดไฟล์ที่เลือกไว้สำหรับ การย้ายข้อมูล (ใช้ -f เพื่อบังคับให้ข้อมูลโดยไม่มีคำเตือน):

    ./media3-migration.sh -l -f /path/to/gradle/project/root
    
  5. เรียกใช้สคริปต์ด้วย -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:

  1. ตรวจสอบว่าสคริปต์เปลี่ยนแปลงโค้ดของคุณอย่างไร: ใช้เครื่องมือความแตกต่างและแก้ไข ปัญหาที่อาจเกิดขึ้น (ลองยื่นข้อบกพร่อง หากคุณคิดว่าสคริปต์มีปัญหา ปัญหาทั่วไปที่เกิดขึ้นโดยไม่ส่งตัวเลือก -f)
  2. สร้างโปรเจ็กต์: ใช้ ./gradlew clean build หรือใน Android Studio เลือก ไฟล์ > ซิงค์โปรเจ็กต์กับไฟล์ Gradle ตามด้วย Build > ล้างโปรเจ็กต์ แล้วเลือกสร้าง > สร้างโปรเจ็กต์ใหม่ (ตรวจสอบบิลด์ใน 'Build - Build Output' แท็บของ Android Studio

ขั้นตอนติดตามผลที่แนะนำ

  1. แก้ไขการเลือกแสดงข้อผิดพลาดเกี่ยวกับการใช้ API ที่ไม่เสถียร
  2. แทนที่การเรียก API ที่เลิกใช้งานแล้ว: ใช้ API ทดแทนที่แนะนำ วางเมาส์ไว้เหนือคำเตือนใน Android Studio และอ่าน JavaDoc ของสัญลักษณ์ที่เลิกใช้งานแล้วเพื่อดูสิ่งที่จะใช้แทนการเรียกที่ระบุ
  3. จัดเรียงคำสั่งการนำเข้า: เปิดโปรเจ็กต์ใน Android Studio จากนั้น คลิกขวาที่โหนดโฟลเดอร์แพ็กเกจในโปรแกรมดูโปรเจ็กต์และเลือก เพิ่มประสิทธิภาพการนำเข้าในแพ็กเกจที่มีไฟล์แหล่งที่มาที่เปลี่ยนแปลง

แทนที่ MediaSessionConnector ด้วย androidx.media3.session.MediaSession

ในโลก MediaSessionCompat แบบเดิม MediaSessionConnector คือ รับผิดชอบการซิงค์สถานะของโปรแกรมเล่นกับสถานะของเซสชัน และรับคำสั่งจากผู้ควบคุมข้อมูลซึ่งจำเป็นต้องมอบสิทธิ์ เมธอดของโปรแกรมเล่น เมื่อใช้ AndroidX Media3 การดำเนินการนี้ดำเนินการโดย MediaSession โดยตรง โดยไม่ต้องใช้เครื่องมือเชื่อมต่อ

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

  2. ในไฟล์ build.gradle ที่คุณรักษาการขึ้นต่อกัน ให้เพิ่ม การใช้ทรัพยากร Dependency ของโมดูลเซสชัน AndroidX Media3 และนําออก Dependency เดิม

    implementation "androidx.media3:media3-session:1.4.1"
    
  3. แทนที่ MediaSessionCompat ด้วย androidx.media3.session.MediaSession

  4. ในเว็บไซต์โค้ดซึ่งคุณสร้าง MediaSessionCompat เดิมไว้ ให้ใช้ androidx.media3.session.MediaSession.Builder เพื่อสร้าง MediaSession ส่งโปรแกรมเล่น เพื่อสร้างเครื่องมือสร้างเซสชัน

    val player = ExoPlayer.Builder(context).build()
    mediaSession = MediaSession.Builder(context, player)
        .setSessionCallback(MySessionCallback())
        .build()
    
  5. ใช้งาน MySessionCallback ตามที่แอปกำหนด โดยคุณจะทำขั้นตอนนี้หรือไม่ก็ได้ ถ้า คุณต้องการอนุญาตให้ตัวควบคุมเพิ่มรายการสื่อ ไปยังโปรแกรมเล่น MediaSession.Callback.onAddMediaItems() ให้บริการที่หลากหลาย เมธอด API แบบเดิมที่เพิ่มรายการสื่อไปยังโปรแกรมเล่นวิดีโอสำหรับการเล่นใน ที่เข้ากันได้แบบย้อนหลัง ซึ่งรวมถึง MediaController.set/addMediaItems() เมธอดของตัวควบคุม Media3 เป็น และ TransportControls.prepareFrom*/playFrom* ของ API เดิม ตัวอย่างการใช้งาน onAddMediaItems สามารถ ได้ใน PlaybackService ของแอปเดโมเซสชัน

  6. ปล่อยเซสชันสื่อในเว็บไซต์โค้ดที่คุณทำลายเซสชันของคุณ ก่อนการย้ายข้อมูล

    mediaSession?.run {
      player.release()
      release()
      mediaSession = null
    }
    

ฟังก์ชัน MediaSessionConnector ใน Media3

ตารางต่อไปนี้แสดง Media3 API ที่จัดการฟังก์ชันการทำงาน ใช้ก่อนหน้านี้ใน MediaSessionConnector

MediaSessionConnectorAndroidX 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 เดิม

วันที่ แผนภาพคอมโพเนนต์ของแอปพร้อมบริการ กิจกรรม และแอปภายนอก
ภาพที่ 1: ภาพรวมคอมโพเนนต์ของแอปสื่อ
  1. คุณต้องลงทะเบียนบริการทั้ง 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>
    
  2. ในไฟล์ build.gradle ที่คุณรักษาการขึ้นต่อกัน ให้เพิ่ม การใช้ทรัพยากร Dependency ในโมดูลเซสชัน AndroidX Media3 และ นำทรัพยากร Dependency เดิมออก

    implementation "androidx.media3:media3-session:1.4.1"
    
  3. เปลี่ยนบริการของคุณให้รับค่าจาก 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(): Callback onAddMediaItems(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:

  1. การอัปเกรดจากเป็นเวอร์ชัน ExoPlayer อาจทำให้โค้ดหยุดคอมไพล์ได้
  2. แอปที่อาศัย 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 พร้อมทางเลือกของวิธีที่เลิกใช้แล้ว
รูปที่ 3: เคล็ดลับเครื่องมือ JavaDoc ใน Android Studio แนะนำทางเลือกอื่นสำหรับสัญลักษณ์ที่เลิกใช้งานแล้ว

ตัวอย่างโค้ดและแอปเดโม

  • แอปเดโมเซสชัน AndroidX Media3 (อุปกรณ์เคลื่อนที่และ WearOS)
    • การทำงานที่กำหนดเอง
    • การแจ้งเตือน UI ของระบบ, MediaButton/BT
    • ตัวควบคุมการเล่นของ Google Assistant
  • UAMP: Android Media Player (Branch media3) (อุปกรณ์เคลื่อนที่, AutomotiveOS)
    • การแจ้งเตือน UI ของระบบ, MediaButton/BT, การกลับมาเล่นอีกครั้ง
    • การควบคุมการเล่น Google Assistant/WearOS
    • AutomotiveOS: คําสั่งที่กําหนดเองและการลงชื่อเข้าใช้