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

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

  • ExoPlayer और उसके एक्सटेंशन
    इसमें लेगसी ExoPlayer प्रोजेक्ट के सभी मॉड्यूल शामिल हैं. इसमें मीडिया सेशन मॉड्यूल को बंद कर दिया गया है. इसके आधार पर, ऐप्लिकेशन या मॉड्यूल 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.* पैकेज)
    MediaBrowserCompat का इस्तेमाल करके क्लाइंट कोड को माइग्रेट करें या androidx.media3.session.MediaBrowser का इस्तेमाल करने के लिए MediaControllerCompat androidx.media3.common.MediaItem के साथ.

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

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

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

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

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

    • अपने ऐप्लिकेशन केcompileSdkVersion को कम से कम 32 तक बढ़ाएं.

    • Gredle और '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. इस पर 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. 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 में से किसी एक का इस्तेमाल करें स्टूडियो चुनें फ़ाइल > प्रोजेक्ट को Gradle फ़ाइलों के साथ सिंक करें. इसके बाद, बिल्ड > प्रोजेक्ट मिटाएं और फिर बनाएं > प्रोजेक्ट फिर से बनाएं (अपने बिल्ड को 'बिल्ड - बिल्ड आउटपुट' टैब पर क्लिक करें.

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

  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.0"
    
  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(). यह कई तरह की करंट और एपीआई के पुराने तरीकों का इस्तेमाल करके, प्लेयर में मीडिया आइटम जोड़े जा सकते हैं. पुराने सिस्टम के साथ काम करता है. इसमें ये चीज़ें शामिल हैं Media3 कंट्रोलर के MediaController.set/addMediaItems() तरीके, जैसे कि TransportControls.prepareFrom*/playFrom* भी लेगसी एपीआई का इस्तेमाल करते हैं. onAddMediaItems को लागू करने पर, सैंपल के तौर पर सेशन डेमो ऐप्लिकेशन के PlaybackService में उपलब्ध होगी.

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

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

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

नीचे दी गई टेबल में, फ़ंक्शन हैंडल करने वाले Media3 एपीआई दिखाए गए हैं MediaSessionConnector में पहले लागू किया गया था.

मीडियासेशनकनेक्टरAndroidX मीडिया3
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 का JavaDoc और इसकी खासियत क्लास MediaSessionService, एपीआई और सेवा के एसिंक्रोनस प्रोग्रामिंग मॉडल की जानकारी दें.

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

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

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

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

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

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

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

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

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

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

PlayerNotificationManager हटाएं

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

ऐप्लिकेशन 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 v1 के उपयोगकर्ताओं को दो समस्याएं आईं और v2 लाइब्रेरी:

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

Media3 में सुधार

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

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

एपीआई लिंट की स्थिर गड़बड़ियों को ठीक करना

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

ऐसे एपीआई जो अब काम नहीं करते

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

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

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

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