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 एपीआई की बेहतर सुविधाओं का इस्तेमाल करें.
  • ऐक्सेस कंट्रोल की बेहतर सुविधा की मदद से, वीडियो चलाने की सुविधाओं का विज्ञापन करें.
  • MediaSessionConnector और PlayerNotificationManager को हटाकर, अपने ऐप्लिकेशन को आसान बनाएं.
  • media-compat क्लाइंट एपीआई (MediaBrowserCompat/MediaControllerCompat/MediaMetadataCompat) के साथ पीछे की ओर काम करने वाला

AndroidX Media3 पर माइग्रेट करने के लिए मीडिया 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 (androidx.media:media:1.4.3+ के android.support.v4.media.* पैकेज के आधार पर)
    androidx.media3.common.MediaItem के साथ androidx.media3.session.MediaBrowser का इस्तेमाल करने के लिए, MediaBrowserCompat या MediaControllerCompat का इस्तेमाल करके क्लाइंट कोड को माइग्रेट करें.

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

  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 माइग्रेट करें

स्क्रिप्ट, androidx.media3 के तहत com.google.android.exoplayer2 से नए पैकेज और मॉड्यूल स्ट्रक्चर पर जाने में मदद करती है. स्क्रिप्ट आपके प्रोजेक्ट पर पुष्टि की कुछ जांच लागू करती है और पुष्टि न हो पाने पर चेतावनियां प्रिंट करती है. ऐसा नहीं करने पर, यह 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 में फ़ाइल > प्रोजेक्ट को Gradle फ़ाइलों के साथ सिंक करें को चुनें. इसके बाद, बिल्ड करें > प्रोजेक्ट को क्लीन करें और फिर बिल्ड करें > प्रोजेक्ट को फिर से बिल्ड करें को चुनें. Android Studio के'बिल्ड - बिल्ड आउटपुट' टैब में अपने बिल्ड को मॉनिटर करें.

फ़ॉलो-अप करने के लिए सुझाए गए तरीके:

  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.4.1"
    
  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.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 की जगह ले लेगी. 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.4.1"
    
  3. अपनी सेवा को MediaBrowserService के बजाय, MediaLibraryService से इनहेरिट करने के लिए बदलें जैसा कि पहले बताया गया है, MediaLibraryService, लेगसी MediaBrowserService के साथ काम करता है. इसलिए, क्लाइंट को अब भी वही बड़ा एपीआई उपलब्ध कराया जा रहा है जो पहले उपलब्ध था. इसलिए, हो सकता है कि कोई ऐप्लिकेशन MediaBrowserService को लागू करने के लिए ज़रूरी ज़्यादातर लॉजिक को बनाए रख सके और उसे नए MediaLibraryService के लिए अडैप्ट कर सके.

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

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

    • MediaLibraryService.MediaLibraryLanguageCallback: कोई सेशन बनाने के लिए, 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 पर मैप करना होगा.

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

PlayerNotificationManager को हटाना

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

कोई ऐप्लिकेशन, onCreate() में अपनी पसंद के मुताबिक MediaNotification.Provider सेट करके सूचना को पसंद के मुताबिक बना सकता है. यह DefaultMediaNotificationProvider की जगह ले लेता है. इसके बाद, 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 API प्लैटफ़ॉर्म को डिज़ाइन के हिसाब से काफ़ी बड़ा किया गया है. इसकी मदद से ऐप्लिकेशन, प्लेबैक के करीब-करीब हर पहलू को पसंद के मुताबिक बना सकते हैं. ExoPlayer के बाद के वर्शन में, कभी-कभी सिंबल के नाम बदले जा सकते हैं या अन्य बदलाव किए जा सकते हैं. जैसे, इंटरफ़ेस पर ज़रूरी नए तरीके. ज़्यादातर मामलों में, नए सिंबल को पेश करके और कुछ वर्शन के लिए पुराने सिंबल को बंद करके, इन गड़बड़ियों को कम किया गया था. इससे डेवलपर को, सिंबल के इस्तेमाल को माइग्रेट करने के लिए समय मिल पाया. हालांकि, ऐसा हमेशा नहीं हो पाता था.

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

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

Media3 में हुए सुधार

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

ExoPlayer v2 से Media3 पर माइग्रेट करने के बाद, आपको एपीआई की कई गड़बड़ियां दिख सकती हैं. इससे ऐसा लग सकता है कि Media3, ExoPlayer v2 के मुकाबले 'कम स्टेबल' है. हालांकि, ऐसा नहीं है. Media3 API के 'अनिश्चित' हिस्सों में स्थिरता का लेवल, 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/Wear OS की मदद से प्लेबैक कंट्रोल करना
    • AutomotiveOS: कस्टम कमांड और साइन-इन