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

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

ওভারভিউ

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

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

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

AndroidX Media3 এ স্থানান্তরিত করার জন্য মিডিয়া API

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

পূর্বশর্ত

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

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

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

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

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

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

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

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

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

MediaSessionConnector androidx.media3.session.MediaSession দিয়ে প্রতিস্থাপন করুন

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

  1. MediaSessionConnector-এর সমস্ত রেফারেন্স এবং ব্যবহার মুছে ফেলুন: আপনি যদি ExoPlayer ক্লাস এবং প্যাকেজগুলি স্থানান্তর করতে স্বয়ংক্রিয় স্ক্রিপ্ট ব্যবহার করেন, তাহলে স্ক্রিপ্টটি সম্ভবত MediaSessionConnector সংক্রান্ত আপনার কোডটিকে একটি অসংলগ্ন অবস্থায় রেখে গেছে যা সমাধান করা যাবে না। আপনি যখন অ্যাপ তৈরি বা শুরু করার চেষ্টা করবেন তখন অ্যান্ড্রয়েড স্টুডিও আপনাকে ভাঙা কোড দেখাবে।

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

    implementation "androidx.media3:media3-session:1.5.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)
        .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 এ প্রয়োগ করা কার্যকারিতা পরিচালনা করে।

মিডিয়া সেশন সংযোগকারী অ্যান্ড্রয়েডএক্স মিডিয়া3
CustomActionProvider MediaSession.Callback.onCustomCommand()/ MediaSession.setCustomLayout()
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 : মিডিয়া অ্যাপ কম্পোনেন্ট ওভারভিউ
  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.5.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 এর বিচ্ছিন্নযোগ্য Result পদ্ধতির বিপরীতে সাধারণ অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং মডেলটি Futures পরিবর্তিত হয়েছে । আপনার পরিষেবা বাস্তবায়ন ফলাফল বিচ্ছিন্ন করার পরিবর্তে একটি অ্যাসিঙ্ক্রোনাস ListenableFuture ফেরত দিতে পারে বা সরাসরি একটি মান ফেরত দিতে একটি অবিলম্বে ভবিষ্যত ফেরত দিতে পারে

PlayerNotificationManager সরান

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

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

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

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

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

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

scope.launch {
    val sessionToken =
        SessionToken(context, ComponentName(context, MusicService::class.java)
    browser =
        MediaBrowser.Builder(context, sessionToken))
            .setListener(BrowserListener())
            .buildAsync()
            .await()
    // Get the library root to start browsing the library.
    root = browser.getLibraryRoot(/* params= */ null).await();
    // Add a MediaController.Listener to listen to player state events.
    browser.addListener(playerListener)
    playerView.setPlayer(browser)
}

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

আরও পদক্ষেপ এবং পরিষ্কার করুন

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

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

পটভূমি

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

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

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

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

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-তে কল করা হয়। আমরা উপযুক্ত বিকল্প সঙ্গে এই ধরনের কল প্রতিস্থাপন সুপারিশ. JavaDoc দেখতে চিহ্নের উপর হোভার করুন যা তার পরিবর্তে কোন API ব্যবহার করতে হবে তা বলে।

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

কোড নমুনা এবং ডেমো অ্যাপ্লিকেশন