AndroidX Media3 মাইগ্রেশন গাইড

বর্তমানে যেসব অ্যাপ স্ট্যান্ডঅ্যালোন com.google.android.exoplayer2 লাইব্রেরি ও androidx.media ব্যবহার করছে, সেগুলিকে androidx.media3-এ মাইগ্রেট করতে হবে। ExoPlayer 2.19.1 থেকে AndroidX Media3 1.1.1-এ Gradle বিল্ড ফাইল, Java ও Kotlin সোর্স ফাইল এবং XML লেআউট ফাইল মাইগ্রেট করতে মাইগ্রেশন স্ক্রিপ্ট ব্যবহার করুন।

এক নজরে

মাইগ্রেট করার আগে, নতুন API-এর সুবিধা, মাইগ্রেট করার জন্য API এবং আপনার অ্যাপের প্রোজেক্টের জন্য প্রয়োজনীয় পূর্বশর্ত সম্পর্কে আরও জানতে নিম্নলিখিত বিভাগগুলি পর্যালোচনা করুন।

Jetpack Media3-এ কেন মাইগ্রেট করবেন

  • এটি হল ExoPlayer-এর নতুন হোম, যেখানে com.google.android.exoplayer2 বন্ধ করে দেওয়া হয়েছে।
  • MediaBrowser/MediaController-এর মাধ্যমে কম্পোনেন্ট/প্রসেস জুড়ে Player API অ্যাক্সেস করুন।
  • MediaSession এবং MediaController API-এর বর্ধিত ক্ষমতা ব্যবহার করুন।
  • ফাইন-গ্রেনড অ্যাক্সেস কন্ট্রোল-এর মাধ্যমে প্লেব্যাক সংক্রান্ত ক্ষমতা বিজ্ঞাপন করুন।
  • MediaSessionConnector ও PlayerNotificationManager সরিয়ে দিয়ে আপনার অ্যাপ আরও সহজ করে তুলুন।
  • মিডিয়া-কম্প্যাট ক্লায়েন্ট API-এর সাথে ব্যাকওয়ার্ড কম্প্যাটিবল (MediaBrowserCompat/MediaControllerCompat/MediaMetadataCompat)

AndroidX Media3-এ মাইগ্রেট করার জন্য মিডিয়া API

  • 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 (androidx.media:media:1.4.3+-এর android.support.v4.media.* প্যাকেজের উপর নির্ভর করে)
    androidx.media3.common.MediaItem-এর সাথে androidx.media3.session.MediaBrowser ব্যবহার করতে MediaBrowserCompat বা MediaControllerCompat ব্যবহার করে ক্লায়েন্ট কোড মাইগ্রেট করুন।

পূর্বশর্ত

  1. আপনার প্রোজেক্ট সোর্স কন্ট্রোলের অধীনে আছে কিনা তা নিশ্চিত করুন

    স্ক্রিপ্ট করা মাইগ্রেশন টুলের মাধ্যমে করা পরিবর্তন যাতে সহজেই আগের অবস্থায় ফিরিয়ে আনতে পারেন তা নিশ্চিত করুন। আপনার প্রোজেক্ট এখনও সোর্স কন্ট্রোলের অধীনে না থাকলে, এখন এটি শুরু করার একটি ভাল সময়। কোনও কারণে আপনি যদি তা করতে না চান, তাহলে মাইগ্রেশন শুরু করার আগে আপনার প্রোজেক্টের ব্যাক-আপ কপি তৈরি করুন।

  2. আপনার অ্যাপ আপডেট করা

    • আমরা সাজেস্ট করি যে আপনি ExoPlayer লাইব্রেরির সবচেয়ে সাম্প্রতিক ভার্সন ব্যবহার করার জন্য আপনার প্রোজেক্ট আপডেট করুন এবং বন্ধ হয়ে যাওয়া পদ্ধতিতে করা যেকোনও কল সরিয়ে দিন। আপনি যদি মাইগ্রেশনের জন্য স্ক্রিপ্ট ব্যবহার করতে চান, তাহলে আপনি যে ভার্সনে আপডেট করছেন সেটির সাথে স্ক্রিপ্ট দ্বারা ম্যানেজ করা ভার্সনটি ম্যাচ করতে হবে।

    • আপনার অ্যাপের compileSdkVersion বাড়িয়ে অন্তত ৩২ করুন।

    • Gradle এবং Android Studio Gradle প্লাগ-ইন সাম্প্রতিক ভার্সনে আপগ্রেড করুন যা উপরে উল্লেখ করা আপডেট করা ডিপেন্ডেন্সির সাথে কাজ করে। যেমন:

      • Android Gradle প্লাগ-ইন ভার্সন: 7.1.0
      • Gradle ভার্সন: ৭.৪
    • অ্যাস্টেরিক্স (*) ব্যবহার করছে এমন সব ওয়াইল্ডকার্ড ইমপোর্ট স্টেটমেন্ট পরিবর্তন করুন এবং সম্পূর্ণভাবে কোয়ালিফাই করা ইমপোর্ট স্টেটমেন্ট ব্যবহার করুন: ওয়াইল্ডকার্ড ইমপোর্ট স্টেটমেন্ট মুছে দিন এবং সম্পূর্ণভাবে কোয়ালিফাই করা স্টেটমেন্ট ইমপোর্ট করতে 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-তে ফাইল > Gradle ফাইলের সাথে প্রোজেক্ট সিঙ্ক করুন, তারপর তৈরি করুন > প্রোজেক্ট ক্লিন করুন এবং তারপর তৈরি করুন > প্রোজেক্ট আবার তৈরি করুন (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 ফাইলে আপনি ডিপেন্ডেন্সি ম্যানেজ করেন, সেখানে AndroidX Media3 সেশন মডিউলে ইমপ্লিমেন্টেশন ডিপেন্ডেন্সি যোগ করুন এবং লিগ্যাসি ডিপেন্ডেন্সি সরিয়ে দিন:

    implementation "androidx.media3:media3-session:1.11.1"
    
  3. MediaSessionCompat-এর পরিবর্তে androidx.media3.session.MediaSession ব্যবহার করুন।

  4. কোড সাইটে যেখানে আপনি লিগ্যাসি MediaSessionCompat তৈরি করেছেন, সেখানে একটি MediaSession তৈরি করতে androidx.media3.session.MediaSession.Builder ব্যবহার করুন। সেশন বিল্ডার তৈরি করতে প্লেয়ার পাস করুন।

    Kotlin

    val player = ExoPlayer.Builder(context).build()
    mediaSession = MediaSession.Builder(context, player).setCallback(MySessionCallback()).build()

    জাভা

    ExoPlayer player = new ExoPlayer.Builder(context).build();
    mediaSession =
        new MediaSession.Builder(context, player).setCallback(new MySessionCallback()).build();

  5. আপনার অ্যাপের প্রয়োজন অনুযায়ী MySessionCallback প্রয়োগ করুন। এটি ঐচ্ছিক। আপনি যদি কন্ট্রোলারকে প্লেয়ারে মিডিয়া আইটেম যোগ করার অনুমতি দিতে চান, তাহলে MediaSession.Callback.onAddMediaItems() প্রয়োগ করুন। এটি বিভিন্ন বর্তমান এবং পুরানো API পদ্ধতি প্রদান করে যা ব্যাকওয়ার্ড কম্প্যাটিবল উপায়ে প্লেব্যাকে প্লেয়ারে মিডিয়া আইটেম যোগ করে। এর মধ্যে Media3 কন্ট্রোলারের MediaController.set/addMediaItems() পদ্ধতি এবং লিগ্যাসি API-এর TransportControls.prepareFrom*/playFrom* পদ্ধতি অন্তর্ভুক্ত। onAddMediaItems-এর স্যাম্পেল ইমপ্লিমেন্টেশন সেশন ডেমো অ্যাপের PlaybackService-এ পাওয়া যাবে।

  6. মাইগ্রেশনের আগে আপনি যেখানে সেশন বন্ধ করেছিলেন, সেই কোড সাইটে মিডিয়া সেশন রিলিজ করুন:

    Kotlin

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

    জাভা

    if (mediaSession != null) {
      mediaSession.getPlayer().release();
      mediaSession.release();
      mediaSession = null;
    }

Media3-এ MediaSessionConnector কার্যকারিতা

নিম্নলিখিত সারণীতে Media3 API দেখানো হয়েছে যা আগে 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-এর JavaDoc এবং এর সুপার ক্লাস MediaSessionService API এবং পরিষেবার অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং মডেলের একটি ভালো ভূমিকা প্রদান করে।

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.11.1"
    
  3. আপনার পরিষেবা পরিবর্তন করে MediaLibraryService থেকে ইনহেরিট করুন, MediaBrowserService-এর পরিবর্তে আগে যেমন বলা হয়েছে, MediaLibraryService পুরনো MediaBrowserService-এর সাথে মানানসই। সেই অনুযায়ী, পরিষেবাটি ক্লায়েন্টদের যে আরও বড় API অফার করছে তা এখনও একই আছে। তাই, MediaBrowserService প্রয়োগ করার জন্য প্রয়োজনীয় বেশিরভাগ লজিক কোনও অ্যাপ রেখে দিতে পারে এবং নতুন MediaLibraryService-এর জন্য এটি মানিয়ে নিতে পারে।

    পুরনো MediaBrowserServiceCompat-এর সাথে তুলনা করলে প্রধান পার্থক্যগুলি হল:

    • পরিষেবার লাইফ-সাইকেল পদ্ধতি প্রয়োগ করুন: পরিষেবায় যে পদ্ধতিগুলি ওভাররাইড করতে হবে সেগুলি হল onCreate/onDestroy, যেখানে একটি অ্যাপ লাইব্রেরি সেশন, প্লেয়ার এবং অন্যান্য রিসোর্স বরাদ্দ/রিলিজ করে। স্ট্যান্ডার্ড সার্ভিস লাইফ-সাইকেল পদ্ধতি ছাড়াও, onCreate-এ তৈরি করা MediaLibrarySession-কে ফিরিয়ে আনতে, একটি অ্যাপকে onGetSession(MediaSession.ControllerInfo) ওভাররাইড করতে হবে।

    • MediaLibraryService.MediaLibrarySessionCallback প্রয়োগ করা: সেশন তৈরি করার জন্য MediaLibraryService.MediaLibrarySessionCallback প্রয়োজন যা প্রকৃত ডোমেন API পদ্ধতি প্রয়োগ করে। তাই, লিগ্যাসি পরিষেবার API পদ্ধতি ওভাররাইড করার পরিবর্তে, আপনি MediaLibrarySession.Callback-এর পদ্ধতি ওভাররাইড করবেন।

      তারপর MediaLibrarySession তৈরি করতে কলব্যাক ব্যবহার করা হয়:

      Kotlin

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

      জাভা

      mediaLibrarySession =
          new MediaLibrarySession.Builder(context, player, new MySessionCallback()).build();

      API ডকুমেন্টেশনে MediaLibrarySessionCallback-এর সম্পূর্ণ API খুঁজুন।

    • প্রয়োগ করুন MediaSession.Callback.onAddMediaItems(): কলব্যাক onAddMediaItems(MediaSession, ControllerInfo, List<MediaItem>) বিভিন্ন বর্তমান ও লিগ্যাসি API পদ্ধতি প্রদান করে যা ব্যাকওয়ার্ড কম্প্যাটিবল উপায়ে প্লেব্যাকের জন্য প্লেয়ারে মিডিয়া আইটেম যোগ করে। এর মধ্যে Media3 কন্ট্রোলারের MediaController.set/addMediaItems() পদ্ধতি, পাশাপাশি লিগ্যাসি API-এর TransportControls.prepareFrom*/playFrom* পদ্ধতি অন্তর্ভুক্ত। কলব্যাকের স্যাম্পেল প্রয়োগ সেশন ডেমো অ্যাপের PlaybackService-এ দেখতে পাওয়া যাবে।

    • AndroidX Media3, MediaBrowserCompat.MediaItem এবং MediaMetadataCompat-এর পরিবর্তে androidx.media3.common.MediaItem ব্যবহার করছে। পুরনো ক্লাসের সাথে যুক্ত আপনার কোডের অংশগুলি সেই অনুযায়ী পরিবর্তন করতে হবে অথবা পরিবর্তে Media3 MediaItem-এ ম্যাপ করতে হবে।

    • MediaBrowserServiceCompat-এর ডিটাচেবল Result অ্যাপ্রোচের বিপরীতে সাধারণ অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং মডেল পরিবর্তন করে Futures করা হয়েছে। আপনার পরিষেবা প্রয়োগের ফলে ফলাফল আলাদা করার পরিবর্তে অ্যাসিঙ্ক্রোনাস ListenableFuture রিটার্ন করতে পারে অথবা সরাসরি ভ্যালু রিটার্ন করার জন্য অবিলম্বে Future রিটার্ন করতে পারে।

PlayerNotificationManager সরান

MediaLibraryService অটোমেটিক মিডিয়া বিজ্ঞপ্তি সাপোর্ট করে এবং PlayerNotificationManager-কে MediaLibraryService বা MediaSessionService ব্যবহার করার সময় সরিয়ে দেওয়া যেতে পারে।

কোনও অ্যাপ onCreate()-এ কাস্টম MediaNotification.Provider সেট করে বিজ্ঞপ্তি কাস্টমাইজ করতে পারে যা DefaultMediaNotificationProvider-কে রিপ্লেস করে। তারপর MediaLibraryService প্রয়োজন অনুযায়ী ফোরগ্রাউন্ডে পরিষেবা চালু করার বিষয়টি দেখে।

MediaLibraryService.updateNotification() ওভাররাইড করার মাধ্যমে, কোনও অ্যাপ বিজ্ঞপ্তি পোস্ট করা এবং প্রয়োজন অনুযায়ী ফোরগ্রাউন্ডে পরিষেবা চালু/বন্ধ করার সম্পূর্ণ মালিকানা নিতে পারে।

MediaBrowser ব্যবহার করে ক্লায়েন্ট কোড মাইগ্রেট করা

AndroidX Media3-এর মাধ্যমে, একটি MediaBrowser MediaController/Player ইন্টারফেস প্রয়োগ করে এবং মিডিয়া লাইব্রেরি ব্রাউজ করার পাশাপাশি মিডিয়া প্লেব্যাক কন্ট্রোল করতে ব্যবহার করা যেতে পারে। আপনি যদি লিগ্যাসি ওয়ার্ল্ডে MediaBrowserCompat এবং MediaControllerCompat তৈরি করতে চান, তাহলে Media3-তে শুধু MediaBrowser ব্যবহার করে আপনি একই কাজ করতে পারবেন।

একটি MediaBrowser তৈরি করা যেতে পারে এবং পরিষেবার সাথে কানেকশন স্থাপিত হওয়ার জন্য অপেক্ষা করতে পারে:

Kotlin

scope.launch {
  val sessionToken = SessionToken(context, ComponentName(context, "MusicService"))
  browser =
    MediaBrowser.Builder(context, sessionToken)
      .setListener(BrowserListener())
      .buildAsync()
      .await()
}

জাভা

SessionToken sessionToken =
    new SessionToken(context, new ComponentName(context, "MusicService"));
ListenableFuture<MediaBrowser> browserFuture =
    new MediaBrowser.Builder(context, sessionToken)
        .setListener(new BrowserListener())
        .buildAsync();

ব্যাকগ্রাউন্ডে প্লেব্যাক কন্ট্রোল করার জন্য কীভাবে MediaController তৈরি করতে হয় তা জানতে মিডিয়া সেশনে প্লেব্যাক কন্ট্রোল করুন লিঙ্কটি দেখুন।

পরবর্তী ধাপ ও ক্লিন-আপ

অস্থির API সংক্রান্ত সমস্যা

Media3-তে মাইগ্রেট করার পরে, আপনি হয়ত অস্থির API ব্যবহার সম্পর্কে লিন্ট সংক্রান্ত সমস্যা দেখতে পাবেন। এই API ব্যবহার করা নিরাপদ এবং লিন্ট সংক্রান্ত সমস্যা হল আমাদের নতুন বাইনারি কম্প্যাটিবিলিটি গ্যারান্টির বাই-প্রোডাক্ট। আপনার যদি কঠোর বাইনারি সামঞ্জস্যের প্রয়োজন না হয়, তাহলে এই ত্রুটিগুলি নিরাপদে একটি @OptIn অ্যানোটেশন দিয়ে দমন করা যেতে পারে।

ব্যাকগ্রাউন্ড

ExoPlayer v1 বা v2-এর কোনওটিই পরবর্তী ভার্সনগুলির মধ্যে লাইব্রেরির বাইনারি সামঞ্জস্য সম্পর্কে কঠোর গ্যারান্টি প্রদান করেনি। ExoPlayer API সারফেস ডিজাইন অনুযায়ী অনেক বড়, যাতে অ্যাপগুলি প্লেব্যাকের প্রায় প্রতিটি দিক কাস্টমাইজ করতে পারে। ExoPlayer-এর পরবর্তী ভার্সনে মাঝে মাঝে সিম্বলের নাম পরিবর্তন বা অন্যান্য ব্রেকিং পরিবর্তন (যেমন, ইন্টারফেসে নতুন প্রয়োজনীয় পদ্ধতি) করা হতে পারে। বেশিরভাগ ক্ষেত্রে, নতুন সিম্বল চালু করার পাশাপাশি পুরনো সিম্বল কিছু ভার্সনের জন্য বন্ধ করে দিয়ে এইসব সমস্যা সমাধান করা হয়েছে, যাতে ডেভেলপাররা তাদের ব্যবহার মাইগ্রেট করার জন্য সময় পান, তবে এটি সবসময় সম্ভব হয়নি।

এই ব্রেকিং পরিবর্তনের ফলে ExoPlayer v1 এবং v2 লাইব্রেরির ব্যবহারকারীদের দুটি সমস্যা হয়েছে:

  1. ExoPlayer ভার্সন থেকে আপগ্রেড করলে কোড কম্পাইল করা বন্ধ হয়ে যেতে পারে।
  2. ExoPlayer-এর উপর সরাসরি এবং ইন্টারমিডিয়েট লাইব্রেরির মাধ্যমে নির্ভর করে এমন অ্যাপকে নিশ্চিত করতে হয় যে দুটি ডিপেন্ডেন্সিই একই ভার্সনের, অন্যথায় বাইনারি ইনকমপ্যাটিবিলিটির কারণে রানটাইম ক্র্যাশ হতে পারে।

Media3-তে করা উন্নতি

Media3, API সারফেসের সাবসেটের জন্য বাইনারি কম্প্যাটিবিলিটির গ্যারান্টি দেয়। যেসব অংশ বাইনারি কম্প্যাটিবিলিটির গ্যারান্টি দেয় না, সেগুলি @UnstableApi দিয়ে চিহ্নিত করা হয়। এই পার্থক্য স্পষ্ট করার জন্য, @OptIn-এর মাধ্যমে অ্যানোটেট না করা হলে, অস্থির API সিম্বলের ব্যবহার লিন্ট এরর জেনারেট করে।

ExoPlayer v2 থেকে Media3-এ মাইগ্রেট করার পরে, আপনি অনেক আনস্টেবল API লিন্ট সংক্রান্ত সমস্যা দেখতে পেতে পারেন। এর ফলে মনে হতে পারে যে ExoPlayer v2-এর তুলনায় Media3 'কম স্টেবল'। এটি সেই কেস নয়। Media3 API-এর 'অস্থির' অংশগুলির ExoPlayer v2 API সারফেসের সম্পূর্ণ অংশের মতো একই লেভেলের স্থিতিশীলতা রয়েছে এবং স্থিতিশীল Media3 API সারফেসের গ্যারান্টি ExoPlayer v2-তে একেবারেই উপলভ্য নয়। পার্থক্যটি হল, লিন্ট সংক্রান্ত সমস্যা এখন আপনাকে বিভিন্ন লেভেলের স্টেবিলিটি সম্পর্কে সতর্ক করে।

অস্থির API লিন্ট সংক্রান্ত সমস্যা ম্যানেজ করা

@OptIn-এর সাথে অস্থির API-এর Java এবং Kotlin ব্যবহার কীভাবে অ্যানোটেট করতে হয় সেই সম্পর্কে বিস্তারিত জানতে এই লিন্ট ত্রুটিগুলির সমস্যা সমাধান বিভাগ দেখুন।

বাতিল করা API

আপনি লক্ষ্য করতে পারেন যে Android Studio-তে বন্ধ হয়ে যাওয়া API-তে করা কলগুলি স্ট্রাইক-থ্রু করা হয়েছে। আমরা এই ধরনের কল উপযুক্ত বিকল্প দিয়ে প্রতিস্থাপন করার সাজেশন দিই। পরিবর্তে কোন API ব্যবহার করতে হবে তা JavaDoc-এ দেখতে চিহ্নের উপর মাউস নিয়ে যান।

স্ক্রিনশট: বন্ধ করে দেওয়া পদ্ধতির বিকল্প সহ JavaDoc কীভাবে ডিসপ্লে করবেন
ছবি ৩: Android Studio-তে JavaDoc টুলটিপ যেকোনও বন্ধ হয়ে যাওয়া চিহ্নের বিকল্প সাজেস্ট করে।

কোডের নমুনা ও ডেমো অ্যাপ

  • AndroidX Media3 সেশন ডেমো অ্যাপ (মোবাইল ও WearOS)
    • কাস্টম অ্যাকশন
    • সিস্টেম UI বিজ্ঞপ্তি, MediaButton/BT
    • Google Assistant প্লেব্যাক কন্ট্রোল
  • UAMP: Android Media Player (branch media3) (মোবাইল, AutomotiveOS)
    • সিস্টেম UI বিজ্ঞপ্তি, MediaButton/BT, প্লেব্যাক আবার চালু করা
    • Google Assistant/WearOS প্লেব্যাক কন্ট্রোল
    • AutomotiveOS: কাস্টম কমান্ড ও সাইন-ইন