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

Apps that are currently using the standalone com.google.android.exoplayer2 library and androidx.media should migrate to androidx.media3 . Use the migration script to migrate gradle build files, Java and Kotlin source files, and XML layout files from ExoPlayer 2.19.1 to AndroidX Media3 1.1.1 .

সংক্ষিপ্ত বিবরণ

মাইগ্রেট করার আগে, নতুন 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 গুলি

  • এক্সোপ্লেয়ার এবং এর এক্সটেনশনগুলি
    এর মধ্যে লিগ্যাসি এক্সোপ্লেয়ার প্রকল্পের সমস্ত মডিউল অন্তর্ভুক্ত রয়েছে, মিডিয়াসেশন মডিউলটি বাদে যা বন্ধ করে দেওয়া হয়েছে। 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.session.MediaBrowser ব্যবহার করে androidx.media3.common.MediaItem ব্যবহার করতে MediaBrowserCompat বা MediaControllerCompat ব্যবহার করে ক্লায়েন্ট কোড মাইগ্রেট করুন।

পূর্বশর্ত

  1. নিশ্চিত করুন যে আপনার প্রকল্পটি উৎস নিয়ন্ত্রণে আছে।

    Make sure you can easily revert changes applied by scripted migration tools. If you don't have your project under source control yet, now is a good time to start with it. If for some reason you don't want to do that, make a backup copy of your project before starting the migration.

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

    • We recommend updating your project to use the most recent version of the ExoPlayer library and remove any calls to deprecated methods. If you intend to use the script for the migration, you need to match the version you are updating to with the version handled by the script.

    • আপনার অ্যাপের compileSdkVersion কমপক্ষে 32 এ বৃদ্ধি করুন।

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

      • অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ: 7.1.0
      • গ্রেডল সংস্করণ: ৭.৪
    • Replace all wildcard import statements that are using an asterix (*) and use fully qualified import statements: Delete the wildcard import statements and use Android Studio to import the fully-qualified statements (F2 - Alt/Enter, F2 - Alt/Enter, ...).

    • Migrate from com.google.android.exoplayer2.PlayerView to com.google.android.exoplayer2.StyledPlayerView . This is necessary because there's no equivalent to com.google.android.exoplayer2.PlayerView in AndroidX Media3.

স্ক্রিপ্ট সাপোর্ট সহ ExoPlayer মাইগ্রেট করুন

The script facilitates moving from com.google.android.exoplayer2 to the new package and module structure under androidx.media3 . The script applies some validation checks on your project and prints warnings if validation fails. Otherwise, it applies the mappings of renamed classes and packages in the resources of an Android gradle project written in Java or 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. আপনার অ্যাপটি যে সংস্করণে আপডেট করেছেন তার সাথে সম্পর্কিত 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. Check how the script changed your code : Use a diff tool and fix potential issues (consider filing a bug if you think the script has a general problem that was introduced without passing the -f option).
  2. Build the project : Either use ./gradlew clean build or in Android Studio choose File > Sync Project with Gradle Files , then Build > Clean project , and then Build > Rebuild project (monitor your build in the 'Build - Build Output' tab of Android Studio ).

প্রস্তাবিত ফলো-আপ পদক্ষেপ:

  1. অস্থির API ব্যবহার সংক্রান্ত ত্রুটির জন্য অপ্ট-ইন সমাধান করুন।
  2. Replace deprecated API calls : Use the suggested replacement API. Hold the pointer over the warning in Android Studio, and consult the JavaDoc of the deprecated symbol to find out what to use instead of a given call.
  3. Sort the import statements : Open the project in Android Studio, then right-click on a package folder node in the project viewer and choose Optimize imports on the packages that contain the changed source files.

MediaSessionConnector এর পরিবর্তে androidx.media3.session.MediaSession ব্যবহার করুন।

In the legacy MediaSessionCompat world, the MediaSessionConnector was responsible for syncing the state of the player with the state of the session and receiving commands from controllers that needed delegation to appropriate player methods. With AndroidX Media3, this is done by the MediaSession directly without requiring a connector.

  1. Remove all references and usage of MediaSessionConnector: If you used the automated script to migrate ExoPlayer classes and packages, then the script likely has left your code in an uncompilable state regarding the MediaSessionConnector that can't be resolved. Android Studio will show you the broken code when you try to build or start the app.

  2. build.gradle ফাইলে যেখানে আপনি আপনার নির্ভরতা বজায় রাখেন, সেখানে AndroidX Media3 সেশন মডিউলে একটি বাস্তবায়ন নির্ভরতা যোগ করুন এবং লিগ্যাসি নির্ভরতা অপসারণ করুন:

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

  4. At the code site where you have created the legacy MediaSessionCompat , use androidx.media3.session.MediaSession.Builder to build a MediaSession . Pass the player to construct the session builder.

    কোটলিন

    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. Implement MySessionCallback as required by your app. This is optional. If you want to allow controllers to add media items to the player, implement MediaSession.Callback.onAddMediaItems() . It serves various current and legacy API methods that add media items to the player for playback in a backwards compatible way. This includes the MediaController.set/addMediaItems() methods of the Media3 controller, as well as the TransportControls.prepareFrom*/playFrom* methods of the legacy API. A sample implementation of onAddMediaItems can be found in the PlaybackService of the session demo app .

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

    কোটলিন

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

    জাভা

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

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

নিম্নলিখিত টেবিলটি Media3 API গুলি দেখায় যা MediaSessionConnector এ পূর্বে বাস্তবায়িত কার্যকারিতা পরিচালনা করে।

মিডিয়াসেশন সংযোগকারী অ্যান্ড্রয়েডএক্স মিডিয়া৩
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 introduces MediaLibraryService that replaces the MediaBrowserServiceCompat . The JavaDoc of MediaLibraryService and its super class MediaSessionService provide a good intro into the API and the asynchronous programming model of the service.

MediaLibraryService MediaBrowserService এর সাথে সামঞ্জস্যপূর্ণ। MediaBrowserCompat বা MediaControllerCompat ব্যবহার করে এমন একটি ক্লায়েন্ট অ্যাপ, MediaLibraryService এর সাথে সংযোগ করার সময় কোড পরিবর্তন ছাড়াই কাজ করে। ক্লায়েন্টের জন্য, আপনার অ্যাপটি MediaLibraryService ব্যবহার করছে নাকি লিগ্যাসি MediaBrowserServiceCompat ব্যবহার করছে তা স্বচ্ছ।

পরিষেবা, কার্যকলাপ এবং বহিরাগত অ্যাপ সহ অ্যাপ উপাদান চিত্র।
চিত্র ১ : মিডিয়া অ্যাপ কম্পোনেন্টের ওভারভিউ
  1. For backwards compatibility to work, you need to register both service interfaces with your service in the AndroidManifest.xml . This way a client finds your service by the required service interface:

    <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.9.2"
    
  3. Change your service to inherit from a MediaLibraryService instead of MediaBrowserService As said earlier, the MediaLibraryService is compatible with the legacy MediaBrowserService . Accordingly, the broader API that the service is offering to clients is still the same. So it's likely that an app can keep most of the logic that is required to implement the MediaBrowserService and adapt it for the new MediaLibraryService .

    লিগ্যাসি MediaBrowserServiceCompat এর সাথে প্রধান পার্থক্যগুলি নিম্নরূপ:

    • Implement the service life-cycle methods: The methods that need to be overridden on the service itself are onCreate/onDestroy , where an app allocates/releases the library session, the player, and other resources. In addition to standard service life-cycle methods, an app needs to override onGetSession(MediaSession.ControllerInfo) to return the MediaLibrarySession that was built in onCreate .

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

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

      কোটলিন

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

      জাভা

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

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

    • Implement MediaSession.Callback.onAddMediaItems() : The callback onAddMediaItems(MediaSession, ControllerInfo, List<MediaItem>) serves various current and legacy API methods that add media items to the player for playback in a backwards compatible way. This includes the MediaController.set/addMediaItems() methods of the Media3 controller, as well as the TransportControls.prepareFrom*/playFrom* methods of the legacy API. A sample implementation of the callback can be found in the PlaybackService of the session demo app .

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

    • The general asynchronous programming model changed to Futures in contrast to the detachable Result approach of the MediaBrowserServiceCompat . Your service implementation can return an asynchronous ListenableFuture instead of detaching a result or return an immediate Future to directly return a value .

প্লেয়ারনোটিফিকেশন ম্যানেজার সরান

MediaLibraryService স্বয়ংক্রিয়ভাবে মিডিয়া বিজ্ঞপ্তি সমর্থন করে এবং MediaLibraryService বা MediaSessionService ব্যবহার করার সময় PlayerNotificationManager সরানো যেতে পারে।

An app can customize the notification by setting a custom MediaNotification.Provider in onCreate() that replaces the DefaultMediaNotificationProvider . The MediaLibraryService then takes care of starting the service in the foreground as required.

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

মিডিয়াব্রাউজার ব্যবহার করে ক্লায়েন্ট কোড মাইগ্রেট করুন

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

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

কোটলিন

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 guarantees binary compatibility for a subset of the API surface. The parts that don't guarantee binary compatibility are marked with @UnstableApi . In order to make this distinction clear, usages of unstable API symbols generate a lint error unless they are annotated with @OptIn .

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

অস্থির API লিন্ট ত্রুটিগুলি পরিচালনা করুন

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

অপ্রচলিত API গুলি

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

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

কোড নমুনা এবং ডেমো অ্যাপস

,

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

সংক্ষিপ্ত বিবরণ

মাইগ্রেট করার আগে, নতুন 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 গুলি

  • এক্সোপ্লেয়ার এবং এর এক্সটেনশনগুলি
    এর মধ্যে লিগ্যাসি এক্সোপ্লেয়ার প্রকল্পের সমস্ত মডিউল অন্তর্ভুক্ত রয়েছে, মিডিয়াসেশন মডিউলটি বাদে যা বন্ধ করে দেওয়া হয়েছে। 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.session.MediaBrowser ব্যবহার করে androidx.media3.common.MediaItem ব্যবহার করতে MediaBrowserCompat বা MediaControllerCompat ব্যবহার করে ক্লায়েন্ট কোড মাইগ্রেট করুন।

পূর্বশর্ত

  1. নিশ্চিত করুন যে আপনার প্রকল্পটি উৎস নিয়ন্ত্রণে আছে।

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

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

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

    • Increase the compileSdkVersion of your app to at least 32 .

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

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

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. অস্থির API ব্যবহার সংক্রান্ত ত্রুটির জন্য অপ্ট-ইন সমাধান করুন।
  2. অবচিত API কলগুলি প্রতিস্থাপন করুন : প্রস্তাবিত প্রতিস্থাপন API ব্যবহার করুন। অ্যান্ড্রয়েড স্টুডিওতে সতর্কতার উপরে পয়েন্টারটি ধরে রাখুন এবং প্রদত্ত কলের পরিবর্তে কী ব্যবহার করবেন তা জানতে অবচিত প্রতীকের JavaDoc দেখুন।
  3. আমদানি বিবৃতিগুলি সাজান : অ্যান্ড্রয়েড স্টুডিওতে প্রকল্পটি খুলুন, তারপর প্রকল্প ভিউয়ারে একটি প্যাকেজ ফোল্ডার নোডে ডান-ক্লিক করুন এবং পরিবর্তিত উৎস ফাইল ধারণকারী প্যাকেজগুলিতে আমদানিগুলি অপ্টিমাইজ করুন নির্বাচন করুন।

MediaSessionConnector এর পরিবর্তে androidx.media3.session.MediaSession ব্যবহার করুন।

লিগ্যাসি MediaSessionCompat জগতে, MediaSessionConnector প্লেয়ারের অবস্থা সেশনের অবস্থার সাথে সিঙ্ক করার এবং উপযুক্ত প্লেয়ার পদ্ধতিতে ডেলিগেশানের প্রয়োজন এমন কন্ট্রোলারদের কাছ থেকে কমান্ড গ্রহণের জন্য দায়ী ছিল। AndroidX মিডিয়া3 এর মাধ্যমে, এটি কোনও সংযোগকারীর প্রয়োজন ছাড়াই সরাসরি MediaSession দ্বারা করা হয়।

  1. Remove all references and usage of MediaSessionConnector: If you used the automated script to migrate ExoPlayer classes and packages, then the script likely has left your code in an uncompilable state regarding the MediaSessionConnector that can't be resolved. Android Studio will show you the broken code when you try to build or start the app.

  2. build.gradle ফাইলে যেখানে আপনি আপনার নির্ভরতা বজায় রাখেন, সেখানে AndroidX Media3 সেশন মডিউলে একটি বাস্তবায়ন নির্ভরতা যোগ করুন এবং লিগ্যাসি নির্ভরতা অপসারণ করুন:

    implementation "androidx.media3:media3-session:1.9.2"
    
  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).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. মাইগ্রেশনের আগে যেখানে আপনি আপনার সেশনটি ধ্বংস করেছিলেন সেই কোড সাইটে মিডিয়া সেশনটি প্রকাশ করুন:

    কোটলিন

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

    জাভা

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

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

নিম্নলিখিত টেবিলটি Media3 API গুলি দেখায় যা MediaSessionConnector এ পূর্বে বাস্তবায়িত কার্যকারিতা পরিচালনা করে।

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

    লিগ্যাসি MediaBrowserServiceCompat এর সাথে প্রধান পার্থক্যগুলি নিম্নরূপ:

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

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

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

      কোটলিন

      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 এর detachable Result পদ্ধতির বিপরীতে সাধারণ অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং মডেলটি Futures এ পরিবর্তিত হয়েছে । আপনার পরিষেবা বাস্তবায়ন একটি ফলাফল বিচ্ছিন্ন করার পরিবর্তে একটি অ্যাসিঙ্ক্রোনাস ListenableFuture ফেরত দিতে পারে অথবা সরাসরি একটি মান ফেরত দেওয়ার জন্য একটি তাৎক্ষণিক Future ফেরত দিতে পারে

প্লেয়ারনোটিফিকেশন ম্যানেজার সরান

MediaLibraryService স্বয়ংক্রিয়ভাবে মিডিয়া বিজ্ঞপ্তি সমর্থন করে এবং MediaLibraryService বা MediaSessionService ব্যবহার করার সময় PlayerNotificationManager সরানো যেতে পারে।

একটি অ্যাপ onCreate() এ একটি কাস্টম MediaNotification.Provider সেট করে বিজ্ঞপ্তিটি কাস্টমাইজ করতে পারে যা DefaultMediaNotificationProvider প্রতিস্থাপন করে। এরপর MediaLibraryService প্রয়োজন অনুযায়ী অগ্রভাগে পরিষেবাটি শুরু করার যত্ন নেয়।

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

মিডিয়াব্রাউজার ব্যবহার করে ক্লায়েন্ট কোড মাইগ্রেট করুন

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

A MediaBrowser can be built and await for the connection to the service being established:

কোটলিন

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();

Take a look into Control playback in the media session to learn how to create a MediaController for controlling playback in the background.

Further steps and clean up

Unstable API errors

After migrating to Media3, you may see lint errors about unstable API usages. These APIs are safe to use and the lint errors are a by-product of our new binary compatibility guarantees. If you don't require strict binary compatibility, these errors can be safely suppressed with an @OptIn annotation.

পটভূমি

Neither ExoPlayer v1 or v2 provided strict guarantees about binary compatibility of the library between subsequent versions. The ExoPlayer API surface is very large by design, in order to allow apps to customize nearly every aspect of playback. Subsequent versions of ExoPlayer would occasionally introduce symbol renames or other breaking changes (eg new required methods on interfaces). In most cases these breakages were mitigated by introducing the new symbol alongside deprecating the old symbol for a few versions, to allow developers time to migrate their usages, but this wasn't always possible.

These breaking changes resulted in two problems for users of the ExoPlayer v1 and v2 libraries:

  1. An upgrade from to the ExoPlayer version could cause code to stop compiling.
  2. An app that depended on ExoPlayer both directly and via an intermediate library had to ensure that both dependencies were the same version, otherwise binary incompatibilities could result in runtime crashes.

Improvements in Media3

Media3 guarantees binary compatibility for a subset of the API surface. The parts that don't guarantee binary compatibility are marked with @UnstableApi . In order to make this distinction clear, usages of unstable API symbols generate a lint error unless they are annotated with @OptIn .

After migrating from ExoPlayer v2 to Media3, you may see a lot of unstable API lint errors. This may make it seem like Media3 is 'less stable' than ExoPlayer v2. This is not the case. The 'unstable' parts of the Media3 API have the same level of stability as the whole of the ExoPlayer v2 API surface, and the guarantees of the stable Media3 API surface are not available in ExoPlayer v2 at all. The difference is simply that a lint error now alerts you to the different levels of stability.

Handle unstable API lint errors

See the troubleshooting section on these lint errors for details on how to annotate Java and Kotlin usages of unstable APIs with @OptIn .

Deprecated APIs

You may notice that calls to deprecated APIs are struck-through in Android Studio. We recommend replacing such calls with the appropriate alternative. Hover over the symbol to see the JavaDoc that tells which API to use instead.

Screenshot: How to display JavaDoc with alternative of deprecated method
Figure 3 : JavaDoc tooltip in Android Studio suggests an alternative for any deprecated symbol.

Code samples and demo apps