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

যেসব অ্যাপ বর্তমানে স্বতন্ত্র 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. আপনার অ্যাপ আপডেট করুন

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

    • আপনার অ্যাপের compileSdkVersion কমপক্ষে 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. MediaSessionConnector এর সকল রেফারেন্স এবং ব্যবহার মুছে ফেলুন: যদি আপনি ExoPlayer ক্লাস এবং প্যাকেজ মাইগ্রেট করার জন্য স্বয়ংক্রিয় স্ক্রিপ্ট ব্যবহার করে থাকেন, তাহলে সম্ভবত স্ক্রিপ্টটি MediaSessionConnector সম্পর্কিত আপনার কোডটিকে একটি অসংলগ্ন অবস্থায় রেখে গেছে যা সমাধান করা যাচ্ছে না। আপনি যখন অ্যাপটি তৈরি বা শুরু করার চেষ্টা করবেন তখন Android Studio আপনাকে ভাঙা কোডটি দেখাবে।

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

    implementation "androidx.media3:media3-session:1.8.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() বাস্তবায়ন করুন। এটি বিভিন্ন বর্তমান এবং লিগ্যাসি API পদ্ধতি পরিবেশন করে যা প্লেয়ারে মিডিয়া আইটেমগুলিকে বিপরীতমুখীভাবে প্লেব্যাকের জন্য যোগ করে। এর মধ্যে Media3 কন্ট্রোলারের MediaController.set/addMediaItems() পদ্ধতি, সেইসাথে লিগ্যাসি API এর TransportControls.prepareFrom*/playFrom* পদ্ধতি অন্তর্ভুক্ত রয়েছে। onAddMediaItems এর একটি নমুনা বাস্তবায়ন সেশন ডেমো অ্যাপের PlaybackService পাওয়া যাবে।

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

    mediaSession?.run {
      player.release()
      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.8.0"
    
  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(this, player, 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 ব্যবহার করে একই কাজ করতে পারেন।

একটি 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 কীভাবে তৈরি করবেন তা শিখতে "মিডিয়া সেশনে প্লেব্যাক নিয়ন্ত্রণ করুন" বিভাগে একবার নজর দিন।

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

অস্থির API ত্রুটি

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

পটভূমি

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

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

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

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

Media3 API পৃষ্ঠের একটি উপসেটের জন্য বাইনারি সামঞ্জস্যের নিশ্চয়তা দেয়। যে অংশগুলি বাইনারি সামঞ্জস্যের নিশ্চয়তা দেয় না সেগুলিকে @UnstableApi দিয়ে চিহ্নিত করা হয়। এই পার্থক্যটি স্পষ্ট করার জন্য, অস্থির API প্রতীকগুলির ব্যবহার একটি লিন্ট ত্রুটি তৈরি করে যদি না সেগুলি @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 কীভাবে প্রদর্শন করবেন
চিত্র ৩ : অ্যান্ড্রয়েড স্টুডিওতে জাভাডক টুলটিপ যেকোনো অবচিত প্রতীকের জন্য একটি বিকল্প প্রস্তাব করে।

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