AndroidX Media3 के डेटा को दूसरी जगह भेजने से जुड़ी गाइड

फ़िलहाल, जो ऐप्लिकेशन स्टैंडअलोन com.google.android.exoplayer2 लाइब्रेरी और androidx.media का इस्तेमाल कर रहे हैं उन्हें androidx.media3 पर माइग्रेट करना चाहिए. gradle बिल्ड फ़ाइलों, Java और Kotlin सोर्स फ़ाइलों, और एक्सएमएल लेआउट फ़ाइलों को ExoPlayer 2.19.1 से AndroidX Media3 1.1.1 पर माइग्रेट करने के लिए, माइग्रेशन स्क्रिप्ट का इस्तेमाल करें.

खास जानकारी

माइग्रेट करने से पहले, इन सेक्शन को पढ़ें. इससे आपको नए एपीआई के फ़ायदों, माइग्रेट करने के लिए उपलब्ध एपीआई, और ज़रूरी शर्तों के बारे में ज़्यादा जानकारी मिलेगी. ये ज़रूरी शर्तें, आपके ऐप्लिकेशन के प्रोजेक्ट को पूरी करनी होंगी.

Jetpack Media3 पर क्यों माइग्रेट करें

  • यह ExoPlayer का नया होम पेज है. वहीं, com.google.android.exoplayer2 को बंद कर दिया गया है.
  • MediaBrowser/MediaController की मदद से, सभी कॉम्पोनेंट/प्रोसेस में Player API को ऐक्सेस करें.
  • MediaSession और MediaController API की बेहतर सुविधाओं का इस्तेमाल करें.
  • ज़्यादा बारीकी से ऐक्सेस कंट्रोल की मदद से, वीडियो चलाने की सुविधाओं का विज्ञापन करें.
  • MediaSessionConnector और PlayerNotificationManager को हटाकर, अपने ऐप्लिकेशन को आसान बनाएं.
  • मीडिया-कंपैट क्लाइंट एपीआई के साथ पिछले वर्शन के साथ काम करने वाला (MediaBrowserCompat/MediaControllerCompat/MediaMetadataCompat)

AndroidX Media3 पर माइग्रेट करने के लिए Media API

  • ExoPlayer और इसके एक्सटेंशन
    इसमें ExoPlayer प्रोजेक्ट के सभी मॉड्यूल शामिल हैं. हालांकि, इसमें mediasession मॉड्यूल शामिल नहीं है, क्योंकि इसे बंद कर दिया गया है. com.google.android.exoplayer2 में मौजूद पैकेज पर निर्भर करने वाले ऐप्लिकेशन या मॉड्यूल को माइग्रेशन स्क्रिप्ट की मदद से माइग्रेट किया जा सकता है.
  • MediaSessionConnector (androidx.media:media:1.4.3+ के androidx.media.* पैकेज के हिसाब से)
    MediaSessionConnector को हटाएं और androidx.media3.session.MediaSession का इस्तेमाल करें.
  • MediaBrowserServiceCompat (androidx.media:media:1.4.3+ के androidx.media.* पैकेज के आधार पर)
    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.common.MediaItem के साथ androidx.media3.session.MediaBrowser का इस्तेमाल किया जा सके.

ज़रूरी शर्तें

  1. पक्का करें कि आपका प्रोजेक्ट सोर्स कंट्रोल में हो

    पक्का करें कि स्क्रिप्ट वाले माइग्रेशन टूल से किए गए बदलावों को आसानी से पहले जैसा किया जा सके. अगर आपने अब तक अपने प्रोजेक्ट को सोर्स कंट्रोल में नहीं रखा है, तो अब इसे शुरू करने का सही समय है. अगर आपको किसी वजह से ऐसा नहीं करना है, तो माइग्रेशन शुरू करने से पहले, अपने प्रोजेक्ट की बैकअप कॉपी बना लें.

  2. ऐप्लिकेशन अपडेट करना

    • हमारा सुझाव है कि आप अपने प्रोजेक्ट को अपडेट करें, ताकि ExoPlayer लाइब्रेरी के सबसे नए वर्शन का इस्तेमाल किया जा सके. साथ ही, बंद किए गए तरीकों के सभी कॉल हटा दें. अगर आपको माइग्रेशन के लिए स्क्रिप्ट का इस्तेमाल करना है, तो आपको अपडेट किए जा रहे वर्शन को स्क्रिप्ट के वर्शन से मैच करना होगा.

    • अपने ऐप्लिकेशन के compileSdkVersion को कम से कम 32 पर सेट करें.

    • Gradle और Android Studio Gradle प्लग इन को अपग्रेड करें. इसके लिए, ऐसा नया वर्शन इस्तेमाल करें जो ऊपर दी गई अपडेट की गई डिपेंडेंसी के साथ काम करता हो. उदाहरण के लिए:

      • Android Gradle प्लगिन का वर्शन: 7.1.0
      • Gradle का वर्शन: 7.4
    • ऐसी सभी वाइल्डकार्ड इंपोर्ट स्टेटमेंट बदलें जिनमें ऐस्टरिक (*) का इस्तेमाल किया जा रहा है. साथ ही, पूरी तरह से क्वालिफ़ाइड इंपोर्ट स्टेटमेंट का इस्तेमाल करें: वाइल्डकार्ड इंपोर्ट स्टेटमेंट मिटाएं और Android Studio का इस्तेमाल करके, पूरी तरह से क्वालिफ़ाइड स्टेटमेंट इंपोर्ट करें (F2 - Alt/Enter, F2 - Alt/Enter, ...).

    • com.google.android.exoplayer2.PlayerView से com.google.android.exoplayer2.StyledPlayerView पर माइग्रेट करें. ऐसा करना ज़रूरी है, क्योंकि AndroidX Media3 में com.google.android.exoplayer2.PlayerView के बराबर कोई सुविधा नहीं है.

स्क्रिप्ट की सुविधा के साथ ExoPlayer को माइग्रेट करना

इस स्क्रिप्ट की मदद से, com.google.android.exoplayer2 से androidx.media3 के नए पैकेज और मॉड्यूल स्ट्रक्चर पर आसानी से माइग्रेट किया जा सकता है. यह स्क्रिप्ट, आपके प्रोजेक्ट पर पुष्टि से जुड़ी कुछ जांचें करती है. अगर पुष्टि नहीं होती है, तो चेतावनियां प्रिंट करती है. ऐसा न होने पर, यह Java या Kotlin में लिखे गए Android Gradle प्रोजेक्ट के संसाधनों में, नाम बदली गई क्लास और पैकेज की मैपिंग लागू करता है.

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. GitHub पर ExoPlayer प्रोजेक्ट के टैग से, माइग्रेशन स्क्रिप्ट डाउनलोड करें. यह स्क्रिप्ट, उस वर्शन के हिसाब से होनी चाहिए जिस पर आपने अपना ऐप्लिकेशन अपडेट किया है:

    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. पैकेज, क्लास, और मॉड्यूल को Media3 पर मैप करने के लिए, -m की मदद से स्क्रिप्ट चलाएं. -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 में File > Sync Project with Gradle Files को चुनें. इसके बाद, Build > Clean project और फिर Build > Rebuild project को चुनें. Android Studio के 'Build - Build Output' टैब में, अपने बिल्ड को मॉनिटर करें.
अगला सेक्शन देखें.

फ़ॉलो-अप के लिए सुझाए गए चरण:

  1. अस्थिर एपीआई के इस्तेमाल से जुड़ी गड़बड़ियों के लिए ऑप्ट-इन करें.
  2. एपीआई के बंद किए गए कॉल को बदलें: सुझाए गए एपीआई का इस्तेमाल करें. 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 फ़ाइल में, जहां डिपेंडेंसी मैनेज की जाती हैं वहां AndroidX Media3 के सेशन मॉड्यूल के लिए, लागू करने से जुड़ी डिपेंडेंसी जोड़ें और लेगसी डिपेंडेंसी हटाएं:

    implementation "androidx.media3:media3-session:1.8.0"
    
  3. MediaSessionCompat को androidx.media3.session.MediaSession से बदलें.

  4. जिस कोड साइट पर आपने लेगसी MediaSessionCompat बनाया है वहां MediaSession बनाने के लिए, androidx.media3.session.MediaSession.Builder का इस्तेमाल करें. सेशन बिल्डर बनाने के लिए, प्लेयर को पास करें.

    val player = ExoPlayer.Builder(context).build()
    mediaSession = MediaSession.Builder(context, player)
        .setSessionCallback(MySessionCallback())
        .build()
    
  5. अपने ऐप्लिकेशन की ज़रूरत के हिसाब से MySessionCallback को लागू करें. हालांकि, ऐसा करना ज़रूरी नहीं है. अगर आपको कंट्रोलर को प्लेयर में मीडिया आइटम जोड़ने की अनुमति देनी है, तो MediaSession.Callback.onAddMediaItems() लागू करें. यह मौजूदा और लेगसी एपीआई के कई ऐसे तरीके उपलब्ध कराता है जिनकी मदद से, मीडिया आइटम को प्लेयर में जोड़ा जा सकता है. इससे, मीडिया आइटम को पुराने सिस्टम के साथ काम करने वाले तरीके से चलाया जा सकता है. इसमें Media3 कंट्रोलर के MediaController.set/addMediaItems() तरीके और लेगसी एपीआई के TransportControls.prepareFrom*/playFrom* तरीके शामिल हैं. onAddMediaItems को लागू करने का एक उदाहरण, सेशन डेमो ऐप्लिकेशन के PlaybackService में देखा जा सकता है.

  6. माइग्रेशन से पहले, कोड साइट पर मीडिया सेशन को रिलीज़ करें. इस साइट पर आपने सेशन को बंद किया था:

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

Media3 में MediaSessionConnector की सुविधा

यहां दी गई टेबल में, Media3 के उन एपीआई के बारे में बताया गया है जो MediaSessionConnector में पहले से लागू की गई सुविधाओं को मैनेज करते हैं.

MediaSessionConnectorAndroidX Media3
CustomActionProvider MediaSession.Callback.onCustomCommand()/ MediaSession.setMediaButtonPreferences()
PlaybackPreparer MediaSession.Callback.onAddMediaItems() (prepare() को इंटरनल तौर पर कॉल किया जाता है)
QueueNavigator ForwardingSimpleBasePlayer
QueueEditor MediaSession.Callback.onAddMediaItems()
RatingCallback MediaSession.Callback.onSetRating()
PlayerNotificationManager DefaultMediaNotificationProvider/ MediaNotification.Provider

MediaBrowserService को MediaLibraryService पर माइग्रेट करना

AndroidX Media3 में MediaLibraryService को पेश किया गया है. यह MediaBrowserServiceCompat की जगह लेगा. MediaLibraryService और इसके सुपरक्लास MediaSessionService के JavaDoc में, एपीआई और सेवा के एसिंक्रोनस प्रोग्रामिंग मॉडल के बारे में अच्छी जानकारी दी गई है.

MediaLibraryService, MediaBrowserService के साथ काम करता है. MediaBrowserCompat या MediaControllerCompat का इस्तेमाल करने वाला क्लाइंट ऐप्लिकेशन, MediaLibraryService से कनेक्ट होने पर कोड में बदलाव किए बिना काम करता रहता है. क्लाइंट को यह साफ़ तौर पर पता चलता है कि आपका ऐप्लिकेशन, MediaLibraryService का इस्तेमाल कर रहा है या लेगसी MediaBrowserServiceCompat का.

ऐप्लिकेशन कॉम्पोनेंट का डायग्राम, जिसमें सेवा, गतिविधि, और बाहरी ऐप्लिकेशन दिखाए गए हैं.
पहली इमेज: मीडिया ऐप्लिकेशन के कॉम्पोनेंट की खास जानकारी
  1. पिछले वर्शन के साथ काम करने की सुविधा का इस्तेमाल करने के लिए, आपको 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 फ़ाइल में, जहां डिपेंडेंसी मैनेज की जाती हैं वहां AndroidX Media3 सेशन मॉड्यूल के लिए,इंपलीमेंटेशन डिपेंडेंसी जोड़ें और लेगसी डिपेंडेंसी हटाएं:

    implementation "androidx.media3:media3-session:1.8.0"
    
  3. MediaBrowserService से इनहेरिट करने के बजाय, अपनी सेवा को MediaLibraryService से इनहेरिट करने के लिए बदलें MediaBrowserService जैसा कि पहले बताया गया है, MediaLibraryService, लेगसी MediaBrowserService के साथ काम करता है. इसलिए, सेवा क्लाइंट को जो एपीआई उपलब्ध करा रही है वह अब भी वही है. इसलिए, ऐसा हो सकता है कि कोई ऐप्लिकेशन, MediaBrowserService को लागू करने के लिए ज़रूरी ज़्यादातर लॉजिक को बनाए रख सके और उसे नए MediaLibraryService के लिए अडैप्ट कर सके.

    लेगसी MediaBrowserServiceCompat की तुलना में, इसमें ये मुख्य अंतर हैं:

    • सेवा के लाइफ़साइकल के तरीकों को लागू करें: सेवा पर जिन तरीकों को बदला जाना चाहिए वे onCreate/onDestroy हैं. यहां ऐप्लिकेशन, लाइब्रेरी सेशन, प्लेयर, और अन्य संसाधनों को असाइन/रिलीज़ करता है. स्टैंडर्ड सर्विस लाइफ़-साइकल के तरीकों के अलावा, किसी ऐप्लिकेशन को onGetSession(MediaSession.ControllerInfo) को ओवरराइड करने की ज़रूरत होती है, ताकि वह MediaLibrarySession को वापस कर सके. यह MediaLibrarySession, onCreate में बनाया गया था.

    • MediaLibraryService.MediaLibrarySessionCallback लागू करें: सेशन बनाने के लिए, MediaLibraryService.MediaLibrarySessionCallback की ज़रूरत होती है. यह डोमेन के एपीआई के तरीकों को लागू करता है. इसलिए, लेगसी सेवा के एपीआई तरीकों को बदलने के बजाय, MediaLibrarySession.Callback के तरीकों को बदलें.

      इसके बाद, कॉलबैक का इस्तेमाल MediaLibrarySession बनाने के लिए किया जाता है:

      mediaLibrarySession =
            MediaLibrarySession.Builder(this, player, MySessionCallback())
               .build()
      

      एपीआई के दस्तावेज़ में, MediaLibrarySessionCallback का पूरा एपीआई ढूंढें.

    • MediaSession.Callback.onAddMediaItems() लागू करें: कॉलबैक onAddMediaItems(MediaSession, ControllerInfo, List<MediaItem>), मौजूदा और लेगसी एपीआई के कई तरीकों के साथ काम करता है. ये तरीके, मीडिया आइटम को प्लेयर में जोड़ते हैं, ताकि उन्हें पुराने वर्शन के साथ काम करने वाले तरीके से चलाया जा सके. इसमें Media3 कंट्रोलर के MediaController.set/addMediaItems() तरीके और लेगसी एपीआई के TransportControls.prepareFrom*/playFrom* तरीके शामिल हैं. कॉलबैक को लागू करने का एक उदाहरण, सेशन डेमो ऐप्लिकेशन के PlaybackService में देखा जा सकता है.

    • AndroidX Media3, MediaBrowserCompat.MediaItem और MediaMetadataCompat के बजाय androidx.media3.common.MediaItem का इस्तेमाल कर रहा है. लेगसी क्लास से जुड़े आपके कोड के कुछ हिस्सों को उसी के मुताबिक बदलना होगा. इसके अलावा, उन्हें Media3 MediaItem पर मैप किया जा सकता है.

    • सामान्य एसिंक्रोनस प्रोग्रामिंग मॉडल को Futures में बदल दिया गया है. इसके उलट, MediaBrowserServiceCompat में Result का इस्तेमाल किया जाता है. आपकी सेवा लागू करने पर, नतीजे को अलग करने के बजाय, एसिंक्रोनस ListenableFuture वापस मिल सकता है. इसके अलावा, सीधे तौर पर वैल्यू वापस पाने के लिए, तुरंत फ़्यूचर वापस मिल सकता है.

PlayerNotificationManager को हटाना

MediaLibraryService में मीडिया सूचनाएं अपने-आप दिखती हैं. साथ ही, MediaLibraryService या MediaSessionService का इस्तेमाल करते समय PlayerNotificationManager को हटाया जा सकता है.

कोई ऐप्लिकेशन, onCreate() में कस्टम MediaNotification.Provider सेट करके, सूचना को पसंद के मुताबिक बना सकता है. इससे DefaultMediaNotificationProvider की जगह MediaNotification.Provider का इस्तेमाल किया जाता है. इसके बाद, MediaLibraryService फ़ोरग्राउंड में सेवा शुरू करने का काम करता है.

MediaLibraryService.updateNotification() को बदलकर, कोई ऐप्लिकेशन सूचना पोस्ट करने और ज़रूरत के मुताबिक फ़ोरग्राउंड में सेवा शुरू/बंद करने का पूरा मालिकाना हक ले सकता है.

MediaBrowser का इस्तेमाल करके क्लाइंट कोड माइग्रेट करना

AndroidX Media3 में, MediaBrowser, MediaController/Player इंटरफ़ेस लागू करता है. इसका इस्तेमाल, मीडिया लाइब्रेरी ब्राउज़ करने के साथ-साथ मीडिया प्लेबैक को कंट्रोल करने के लिए भी किया जा सकता है. अगर आपको लेगसी वर्शन में MediaBrowserCompat और MediaControllerCompat बनाना पड़ता था, तो Media3 में सिर्फ़ MediaBrowser का इस्तेमाल करके ऐसा किया जा सकता है.

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 बनाने का तरीका जानने के लिए, मीडिया सेशन में प्लेबैक कंट्रोल करना लेख पढ़ें.

आगे के चरण और स्टोरेज खाली करना

एपीआई की ऐसी गड़बड़ियां जो ठीक नहीं हुईं

Media3 पर माइग्रेट करने के बाद, आपको एपीआई के अस्थिर इस्तेमाल के बारे में लिंट की गड़बड़ियां दिख सकती हैं. इन एपीआई का इस्तेमाल करना सुरक्षित है. साथ ही, लिंट की गड़बड़ियां, बाइनरी कंपैटिबिलिटी की नई गारंटी का नतीजा हैं. अगर आपको बाइनरी फ़ाइल के साथ पूरी तरह से काम करने की ज़रूरत नहीं है, तो इन गड़बड़ियों को @OptIn एनोटेशन की मदद से छिपाया जा सकता है.

बैकग्राउंड

ExoPlayer v1 या v2 में से किसी ने भी, लाइब्रेरी के बाइनरी कंपैटिबिलिटी के बारे में कोई गारंटी नहीं दी थी. ExoPlayer का एपीआई सरफेस, डिज़ाइन के हिसाब से बहुत बड़ा है. इससे ऐप्लिकेशन को वीडियो चलाने से जुड़े हर पहलू को पसंद के मुताबिक बनाने की सुविधा मिलती है. ExoPlayer के बाद के वर्शन में, कभी-कभी सिंबल के नाम बदल जाते थे या अन्य बड़े बदलाव हो जाते थे. जैसे, इंटरफ़ेस पर नए ज़रूरी तरीके. ज़्यादातर मामलों में, इन समस्याओं को ठीक करने के लिए, कुछ वर्शन के लिए पुराने सिंबल को बंद करने के साथ-साथ नया सिंबल भी पेश किया गया था. इससे डेवलपर को अपने इस्तेमाल के तरीके को माइग्रेट करने का समय मिल गया. हालांकि, ऐसा हमेशा नहीं हो सका.

इन बड़े बदलावों की वजह से, ExoPlayer v1 और v2 लाइब्रेरी इस्तेमाल करने वाले लोगों को दो समस्याएं हुईं:

  1. ExoPlayer के वर्शन को अपग्रेड करने से, कोड कंपाइल होना बंद हो सकता है.
  2. जो ऐप्लिकेशन सीधे तौर पर और इंटरमीडिएट लाइब्रेरी के ज़रिए ExoPlayer पर निर्भर था उसे यह पक्का करना होता था कि दोनों निर्भरताएं एक ही वर्शन की हों. ऐसा न होने पर, बाइनरी इनकंपैटिबिलिटी की वजह से रनटाइम क्रैश हो सकते हैं.

Media3 में किए गए सुधार

Media3, एपीआई के सबसेट के लिए बाइनरी फ़ाइल के साथ काम करने की सुविधा की गारंटी देता है. जिन हिस्सों में बाइनरी कंपैटिबिलिटी की गारंटी नहीं दी जाती है उन्हें @UnstableApi के तौर पर मार्क किया जाता है. इस अंतर को साफ़ तौर पर समझाने के लिए, अस्थिर एपीआई सिंबल के इस्तेमाल से लिंट की गड़बड़ी जनरेट होती है. ऐसा तब तक होता है, जब तक उन्हें @OptIn के साथ एनोटेट नहीं किया जाता.

ExoPlayer v2 से Media3 पर माइग्रेट करने के बाद, आपको एपीआई से जुड़ी कई ऐसी गड़बड़ियां दिख सकती हैं जो ठीक नहीं हैं. इस वजह से, ऐसा लग सकता है कि Media3, ExoPlayer v2 से 'कम स्टेबल' है. हालांकि, ऐसा नहीं है. Media3 API के 'unstable' हिस्सों में, ExoPlayer v2 API के पूरे एपीआई की तरह ही स्थिरता होती है. साथ ही, Media3 API के स्टेबल एपीआई की गारंटी, ExoPlayer v2 में उपलब्ध नहीं है. फ़र्क़ सिर्फ़ इतना है कि अब लिंट की गड़बड़ी से, आपको स्थिरता के अलग-अलग लेवल के बारे में सूचना मिलती है.

एपीआई लिंट की ऐसी गड़बड़ियां ठीक करना जो बार-बार बदलती रहती हैं

@OptIn का इस्तेमाल करके, Java और Kotlin में अस्थिर एपीआई के इस्तेमाल को एनोटेट करने के तरीके के बारे में जानने के लिए, लिंट की इन गड़बड़ियों को ठीक करने से जुड़ा सेक्शन देखें.

बंद किए गए एपीआई

आपको दिख सकता है कि Android Studio में, बंद किए गए एपीआई के कॉल पर स्ट्राइक-थ्रू किया गया है. हमारा सुझाव है कि आप इस तरह के कॉल को सही विकल्प से बदलें. सिंबल पर कर्सर घुमाकर JavaDoc देखें. इससे पता चलता है कि इसके बजाय किस एपीआई का इस्तेमाल करना है.

स्क्रीनशॉट: बंद की गई विधि के विकल्प के साथ JavaDoc को दिखाने का तरीका
तीसरी इमेज: Android Studio में JavaDoc टूलटिप, किसी भी डेप्रिकेट किए गए सिंबल के लिए विकल्प सुझाती है.

कोड सैंपल और डेमो ऐप्लिकेशन

  • AndroidX Media3 सेशन डेमो ऐप्लिकेशन (मोबाइल और WearOS)
    • पसंद के मुताबिक की जाने वाली कार्रवाइयां
    • सिस्टम यूज़र इंटरफ़ेस (यूआई) सूचना, MediaButton/BT
    • Google Assistant की मदद से प्लेबैक कंट्रोल करना
  • UAMP: Android Media Player (branch media3) (मोबाइल, AutomotiveOS)
    • सिस्टम यूज़र इंटरफ़ेस (यूआई) सूचना, MediaButton/BT, वीडियो फिर से शुरू करना
    • Google Assistant/WearOS पर प्लेबैक कंट्रोल करने की सुविधा
    • AutomotiveOS: कस्टम कमांड और साइन-इन