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

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

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

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

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

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

মিডিয়া এপিআইগুলোকে AndroidX Media3-তে স্থানান্তরিত করা হবে

  • এক্সোপ্লেয়ার এবং এর এক্সটেনশনগুলি
    এর মধ্যে লিগ্যাসি ExoPlayer প্রোজেক্টের মিডিয়াসেশন মডিউলটি ছাড়া বাকি সব মডিউল অন্তর্ভুক্ত রয়েছে, কারণ মিডিয়াসেশন মডিউলটি এখন আর চালু নেই। com.google.android.exoplayer2 এর প্যাকেজগুলোর ওপর নির্ভরশীল অ্যাপ বা মডিউলগুলো মাইগ্রেশন স্ক্রিপ্ট ব্যবহার করে মাইগ্রেট করা যায়।
  • MediaSessionConnector (androidx.media:media:1.4.3+ এর 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 বা MediaControllerCompat ব্যবহার করে এমন ক্লায়েন্ট কোডকে androidx.media3.session.MediaBrowser সহ androidx.media3.common.MediaItem ব্যবহার করার জন্য মাইগ্রেট করুন।

পূর্বশর্ত

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

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

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

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

    • আপনার অ্যাপের compileSdkVersion বাড়িয়ে কমপক্ষে 32 করুন।

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

      • অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ: ৭.১.০
      • গ্রেডল সংস্করণ: ৭.৪
    • যেসব ওয়াইল্ডকার্ড ইম্পোর্ট স্টেটমেন্টে অ্যাস্টারিক্স (*) ব্যবহার করা হয়েছে, সেগুলোকে সম্পূর্ণ কোয়ালিফাইড ইম্পোর্ট স্টেটমেন্ট দিয়ে প্রতিস্থাপন করুন : ওয়াইল্ডকার্ড ইম্পোর্ট স্টেটমেন্টগুলো মুছে ফেলুন এবং অ্যান্ড্রয়েড স্টুডিও ব্যবহার করে সম্পূর্ণ কোয়ালিফাইড স্টেটমেন্টগুলো ইম্পোর্ট করুন (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 ব্যবহার করুন অথবা অ্যান্ড্রয়েড স্টুডিওতে File > Sync Project with Gradle Files নির্বাচন করে Build > Clean project এবং তারপর Build > Rebuild project- এ যান ( অ্যান্ড্রয়েড স্টুডিওর 'Build - Build Output' ট্যাবে আপনার বিল্ড পর্যবেক্ষণ করুন)।

সুপারিশকৃত পরবর্তী পদক্ষেপসমূহ:

  1. অস্থিতিশীল এপিআই ব্যবহারের ক্ষেত্রে অপ্ট-ইন সংক্রান্ত ত্রুটিগুলির সমাধান করুন।
  2. অপ্রচলিত API কলগুলি প্রতিস্থাপন করুন : প্রস্তাবিত বিকল্প API ব্যবহার করুন। Android Studio-তে সতর্কবার্তাটির উপর পয়েন্টারটি ধরে রাখুন এবং একটি নির্দিষ্ট কলের পরিবর্তে কী ব্যবহার করতে হবে তা জানতে অপ্রচলিত সিম্বলটির JavaDoc দেখুন।
  3. ইম্পোর্ট স্টেটমেন্টগুলো সাজান : অ্যান্ড্রয়েড স্টুডিওতে প্রজেক্টটি খুলুন, তারপর প্রজেক্ট ভিউয়ারে একটি প্যাকেজ ফোল্ডার নোডের উপর রাইট-ক্লিক করুন এবং পরিবর্তিত সোর্স ফাইল ধারণকারী প্যাকেজগুলোর জন্য 'Optimize imports' বিকল্পটি বেছে নিন।

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.10.0"
    
  3. MediaSessionCompat কে androidx.media3.session.MediaSession দিয়ে প্রতিস্থাপন করুন।

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

    কোটলিন

    val player = ExoPlayer.Builder(context).build()
    mediaSession = MediaSession.Builder(context, player).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 এবং এর সুপার ক্লাস MediaSessionService এর JavaDoc এই সার্ভিসের 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.10.0"
    
  3. আপনার MediaLibraryService MediaBrowserService এর পরিবর্তে MediaLibraryService থেকে ইনহেরিট করার জন্য পরিবর্তন করুন। আগেই যেমন বলা হয়েছে, MediaLibraryService পুরোনো MediaBrowserService সাথে সামঞ্জস্যপূর্ণ। সেই অনুযায়ী, সার্ভিসটি ক্লায়েন্টদের যে বিস্তৃত API অফার করছে, তা এখনও একই আছে। তাই এমন সম্ভাবনা রয়েছে যে, একটি অ্যাপ MediaBrowserService ইমপ্লিমেন্ট করার জন্য প্রয়োজনীয় বেশিরভাগ লজিক রেখে দিতে পারবে এবং সেটিকে নতুন MediaLibraryService জন্য মানিয়ে নিতে পারবে।

    পুরোনো MediaBrowserServiceCompat এর তুলনায় প্রধান পার্থক্যগুলো নিম্নরূপ:

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

    • 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 এর ডিটাচেবল Result পদ্ধতির বিপরীতে, সাধারণ অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং মডেলটি Futures এ পরিবর্তিত হয়েছে । আপনার সার্ভিস ইমপ্লিমেন্টেশন একটি রেজাল্ট ডিটাচ করার পরিবর্তে একটি অ্যাসিঙ্ক্রোনাস ListenableFuture রিটার্ন করতে পারে, অথবা সরাসরি একটি ভ্যালু রিটার্ন করার জন্য একটি ইমিডিয়েট ফিউচার রিটার্ন করতে পারে

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

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

একটি অ্যাপ onCreate() ফাংশনে DefaultMediaNotificationProvider কে প্রতিস্থাপন করে একটি কাস্টম MediaNotification.Provider সেট করার মাধ্যমে নোটিফিকেশনটি কাস্টমাইজ করতে পারে। এরপর MediaLibraryService প্রয়োজন অনুযায়ী সার্ভিসটিকে ফোরগ্রাউন্ডে চালু করার কাজটি করে।

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 তৈরি করতে হয়, তা শিখতে মিডিয়া সেশনের 'Control playback' অংশটি দেখুন।

পরবর্তী পদক্ষেপ এবং পরিচ্ছন্নতা

অস্থিতিশীল এপিআই ত্রুটি

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

পটভূমি

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

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

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

মিডিয়া৩-এর উন্নতি

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

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

অস্থিতিশীল এপিআই লিন্ট ত্রুটিগুলি পরিচালনা করুন

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

অপ্রচলিত এপিআই

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

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

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