একটি মিডিয়া সেশন ব্যবহার করে

মিডিয়া সেশনগুলি একটি অডিও বা ভিডিও প্লেয়ারের সাথে ইন্টারঅ্যাক্ট করার একটি সর্বজনীন উপায় প্রদান করে। অ্যান্ড্রয়েডকে জানিয়ে যে কোনও অ্যাপে মিডিয়া চলছে, প্লেব্যাক নিয়ন্ত্রণগুলি অ্যাপে অর্পণ করা যেতে পারে। মিডিয়া সেশনের সাথে একীভূত করা একটি অ্যাপকে বাহ্যিকভাবে মিডিয়া প্লেব্যাকের বিজ্ঞাপন দিতে এবং বাহ্যিক উত্স থেকে প্লেব্যাক কমান্ড পেতে অনুমতি দেয়। এই উত্সগুলি শারীরিক বোতাম (যেমন হেডসেট বা টিভি রিমোট কন্ট্রোলের প্লে বোতাম) বা পরোক্ষ কমান্ড (যেমন Google সহকারীকে "পজ" নির্দেশ দেওয়া) হতে পারে। মিডিয়া সেশন তারপরে এই কমান্ডগুলিকে অ্যাপে অর্পণ করে যা সেগুলিকে মিডিয়া প্লেয়ারে প্রয়োগ করে যার জন্য এটি স্বচ্ছ যেখানে কমান্ডের উৎপত্তি হয়েছে৷

একটি মিডিয়া সেশন প্লেয়ারের সাথে থাকে যা এটি পরিচালনা করে। আপনার মিডিয়া সেশন এবং তার সংশ্লিষ্ট প্লেয়ারের মালিকানাধীন কার্যকলাপ বা পরিষেবার onCreate() পদ্ধতিতে একটি মিডিয়া সেশন তৈরি এবং শুরু করা উচিত।

মিডিয়া সেশন শুরু করুন

একটি নতুন-সৃষ্ট মিডিয়া সেশনের কোন ক্ষমতা নেই। আপনাকে অবশ্যই এই পদক্ষেপগুলি সম্পাদন করে সেশনটি শুরু করতে হবে:

  • পতাকা সেট করুন যাতে মিডিয়া সেশন মিডিয়া কন্ট্রোলার এবং মিডিয়া বোতাম থেকে কলব্যাক গ্রহণ করতে পারে।
  • PlaybackStateCompat এর একটি উদাহরণ তৈরি করুন এবং শুরু করুন এবং এটিকে সেশনে বরাদ্দ করুন। প্লেব্যাক স্টেট পুরো সেশন জুড়ে পরিবর্তিত হয়, তাই আমরা পুনঃব্যবহারের জন্য PlaybackStateCompat.Builder ক্যাশ করার পরামর্শ দিই।
  • MediaSessionCompat.Callback এর একটি উদাহরণ তৈরি করুন এবং এটিকে সেশনে বরাদ্দ করুন (নীচে কলব্যাকগুলিতে আরও)।

আপনার উচিত সেশনের মালিকানাধীন কার্যকলাপ বা পরিষেবার onCreate() পদ্ধতিতে একটি মিডিয়া সেশন তৈরি এবং আরম্ভ করা।

আপনার অ্যাপ্লিকেশানটি নতুনভাবে আরম্ভ করা হলে (বা বন্ধ হয়ে গেলে) মিডিয়া বোতামগুলি কাজ করার জন্য, এর PlaybackState অবশ্যই একটি প্লে অ্যাকশন থাকতে হবে যা মিডিয়া বোতামটি পাঠায় তার সাথে মেলে। এই কারণেই শুরু করার সময় ACTION_PLAY সেশন স্টেটে বরাদ্দ করা হয়। আরও তথ্যের জন্য, মিডিয়া বোতামগুলির প্রতিক্রিয়া দেখুন।

প্লেব্যাক অবস্থা এবং মেটাডেটা বজায় রাখুন

দুটি শ্রেণী আছে যা একটি মিডিয়া সেশনের অবস্থার প্রতিনিধিত্ব করে।

PlaybackStateCompat ক্লাস প্লেয়ারের বর্তমান অপারেশনাল অবস্থা বর্ণনা করে। এটা অন্তর্ভুক্ত:

  • পরিবহন অবস্থা (প্লেয়ার খেলছে/পজ করছে/বাফার করছে কিনা ইত্যাদি। getState() দেখুন )
  • একটি ত্রুটি কোড এবং ঐচ্ছিক ত্রুটি বার্তা, যখন প্রযোজ্য। ( getErrorCode() দেখুন এবং নিচে রাজ্য এবং ত্রুটি পড়ুন।)
  • খেলোয়াড়ের অবস্থান
  • বৈধ নিয়ামক ক্রিয়া যা বর্তমান অবস্থায় পরিচালনা করা যেতে পারে

MediaMetadataCompat ক্লাসটি যে উপাদানটি বাজছে তা বর্ণনা করে:

  • শিল্পীর নাম, অ্যালবাম এবং ট্র্যাক
  • ট্র্যাক সময়কাল
  • লক স্ক্রিনে প্রদর্শনের জন্য অ্যালবাম আর্টওয়ার্ক। ছবিটি একটি বিটম্যাপ যার সর্বোচ্চ আকার 320x320dp (যদি বড় হয়, এটি ছোট করা হয়)।
  • ContentUris এর একটি উদাহরণ যা আর্টওয়ার্কের একটি বড় সংস্করণের দিকে নির্দেশ করে

প্লেয়ার স্টেট এবং মেটাডেটা মিডিয়া সেশনের জীবনে পরিবর্তিত হতে পারে। প্রতিবার স্টেট বা মেটাডেটা পরিবর্তিত হলে, আপনাকে অবশ্যই প্রতিটি ক্লাসের জন্য সংশ্লিষ্ট বিল্ডার ব্যবহার করতে হবে, PlaybackStateCompat.Builder() বা MediaMetadataCompat.Builder() , এবং তারপর setPlaybackState() বা setMetaData() কল করে মিডিয়া সেশনে নতুন উদাহরণ পাস করতে হবে। এই ঘনঘন ক্রিয়াকলাপগুলি থেকে সামগ্রিক মেমরি খরচ কমাতে, একবার বিল্ডার তৈরি করা এবং সেশনের পুরো জীবন জুড়ে তাদের পুনরায় ব্যবহার করা একটি ভাল ধারণা।

রাষ্ট্র এবং ত্রুটি

মনে রাখবেন যে PlaybackState হল একটি বস্তু যাতে সেশনের প্লেব্যাক অবস্থার জন্য আলাদা মান থাকে ( getState() ) এবং যখন প্রয়োজন হয়, একটি সংশ্লিষ্ট ত্রুটি কোড ( getErrorCode() )। ত্রুটিগুলি মারাত্মক বা অ-মারাত্মক হতে পারে:

যখনই প্লেব্যাক বাধাপ্রাপ্ত হয়, আপনার একটি মারাত্মক ত্রুটি তৈরি করা উচিত: পরিবহন অবস্থাকে STATE_ERROR এ সেট করুন এবং setErrorMessage(int, CharSequence) এর সাথে একটি সংশ্লিষ্ট ত্রুটি নির্দিষ্ট করুন। যতক্ষণ পর্যন্ত প্লেব্যাক ত্রুটি দ্বারা অবরুদ্ধ হয়, PlaybackState STATE_ERROR এবং ত্রুটি রিপোর্ট করা চালিয়ে যেতে হবে।

একটি অ-মারাত্মক ত্রুটি ঘটে যখন আপনার অ্যাপ্লিকেশন একটি অনুরোধ পরিচালনা করতে পারে না, কিন্তু প্লে করা চালিয়ে যেতে পারে: পরিবহনটি একটি "স্বাভাবিক" অবস্থায় থাকে (যেমন STATE_PLAYING ) কিন্তু PlaybackState একটি ত্রুটি কোড ধারণ করে৷ উদাহরণস্বরূপ, যদি শেষ গানটি বাজানো হয় এবং ব্যবহারকারী পরবর্তী গানে এড়িয়ে যাওয়ার অনুরোধ করেন, তাহলে প্লেব্যাক চালিয়ে যেতে পারে, তবে আপনার ত্রুটি কোড ERROR_CODE_END_OF_QUEUE সহ একটি নতুন PlaybackState তৈরি করা উচিত এবং তারপর setPlaybackState() কল করুন। সেশনের সাথে সংযুক্ত মিডিয়া কন্ট্রোলাররা onPlaybackStateChanged() কলব্যাক গ্রহণ করবে এবং ব্যবহারকারীকে ব্যাখ্যা করবে কি হয়েছে। একটি অ-মারাত্মক ত্রুটি শুধুমাত্র একবার রিপোর্ট করা উচিত, যখন এটি ঘটে। পরের বার সেশন PlaybackState আপডেট করার সময় একই অ-প্রাণ ত্রুটি আবার সেট করবেন না (যদি না একটি নতুন অনুরোধের প্রতিক্রিয়ায় ত্রুটিটি ঘটে থাকে)।

মিডিয়া সেশন লক স্ক্রীন

Android 4.0 (API স্তর 14) দিয়ে শুরু করে সিস্টেমটি একটি মিডিয়া সেশনের প্লেব্যাক অবস্থা এবং মেটাডেটা অ্যাক্সেস করতে পারে। এইভাবে লক স্ক্রিন মিডিয়া নিয়ন্ত্রণ এবং আর্টওয়ার্ক প্রদর্শন করতে পারে। অ্যান্ড্রয়েড সংস্করণের উপর নির্ভর করে আচরণ পরিবর্তিত হয়।

অ্যালবাম আর্টওয়ার্ক

Android 4.0 (API স্তর 14) এ Android 10 (API স্তর 29) এর মাধ্যমে, লক স্ক্রিনের পটভূমি আপনার অ্যালবাম আর্টওয়ার্ক প্রদর্শন করে - তবে শুধুমাত্র যদি মিডিয়া সেশনের মেটাডেটা একটি পটভূমি বিটম্যাপ অন্তর্ভুক্ত করে।

পরিবহন নিয়ন্ত্রণ

Android 4.0 (API লেভেল 14) এ Android 4.4 (API লেভেল 19) এর মাধ্যমে, যখন একটি মিডিয়া সেশন সক্রিয় থাকে এবং মিডিয়া সেশনের মেটাডেটা একটি ব্যাকগ্রাউন্ড বিটম্যাপ অন্তর্ভুক্ত করে তখন লক স্ক্রীন স্বয়ংক্রিয়ভাবে পরিবহন নিয়ন্ত্রণ প্রদর্শন করে।

অ্যান্ড্রয়েড 5.0 (এপিআই লেভেল 21) বা তার বেশিতে সিস্টেমটি লক স্ক্রিনে পরিবহন নিয়ন্ত্রণ প্রদান করে না। পরিবর্তে, পরিবহন নিয়ন্ত্রণগুলি প্রদর্শন করতে আপনার একটি MediaStyle বিজ্ঞপ্তি ব্যবহার করা উচিত।

কাস্টম অ্যাকশন যোগ করুন

মিডিয়া অ্যাপ্লিকেশন কাস্টম কর্ম সংজ্ঞায়িত করতে পারে; যেমন: থাম্বস আপ, লাইক বা রিওয়াইন্ড ৩০ সেকেন্ড। একটি কাস্টম কর্ম সম্পূর্ণ নতুন আচরণ বাস্তবায়ন করা উচিত. PlaybackStateCompat- এ সংজ্ঞায়িত স্ট্যান্ডার্ড ট্রান্সপোর্ট কন্ট্রোল অ্যাকশনগুলির একটি প্রতিস্থাপন করতে একটি কাস্টম অ্যাকশন ব্যবহার করবেন না।

addCustomAction() দিয়ে কাস্টম অ্যাকশন যোগ করুন। নিম্নলিখিত উদাহরণটি দেখায় কিভাবে একটি থাম্বস-আপ অ্যাকশনের জন্য একটি নিয়ন্ত্রণ যোগ করতে হয়:

কোটলিন

stateBuilder.addCustomAction(
        PlaybackStateCompat.CustomAction.Builder(
                CUSTOM_ACTION_THUMBS_UP,
                resources.getString(R.string.thumbs_up),
                thumbsUpIcon
        ).run {
            setExtras(customActionExtras)
            build()
        }
)

জাভা

stateBuilder.addCustomAction(new PlaybackStateCompat.CustomAction.Builder(
    CUSTOM_ACTION_THUMBS_UP, resources.getString(R.string.thumbs_up), thumbsUpIcon)
    .setExtras(customActionExtras)
    .build());

একটি সম্পূর্ণ উদাহরণের জন্য ইউনিভার্সাল মিউজিক প্লেয়ার দেখুন।

আপনি onCustomAction() দিয়ে কর্মের প্রতিক্রিয়া জানান।

কোটলিন

override fun onCustomAction(action: String, extras: Bundle?) {
    when(action) {
        CUSTOM_ACTION_THUMBS_UP -> {
            ...
        }
    }
}

জাভা

@Override
public void onCustomAction(@NonNull String action, Bundle extras) {
    if (CUSTOM_ACTION_THUMBS_UP.equals(action)) {
        ...
    }
}

এছাড়াও ইউনিভার্সাল মিউজিক প্লেয়ার দেখুন।

মিডিয়া সেশন কলব্যাক

প্রধান মিডিয়া সেশন কলব্যাক পদ্ধতি হল onPlay() , onPause() , এবং onStop() । এখানেই আপনি কোড যোগ করেন যা আপনার প্লেয়ারকে নিয়ন্ত্রণ করে।

যেহেতু আপনি রানটাইমে সেশনের কলব্যাক ইনস্ট্যান্ট এবং সেট করেন ( onCreate() এ), আপনার অ্যাপটি বিকল্প কলব্যাকগুলিকে সংজ্ঞায়িত করতে পারে যা বিভিন্ন প্লেয়ার ব্যবহার করে এবং ডিভাইস এবং/অথবা সিস্টেম স্তরের উপর নির্ভর করে উপযুক্ত কলব্যাক/প্লেয়ার সমন্বয় বেছে নিতে পারে। আপনি বাকি অ্যাপ পরিবর্তন না করে প্লেয়ার পরিবর্তন করতে পারেন। উদাহরণস্বরূপ, আপনি অ্যান্ড্রয়েড 4.1 (API স্তর 16) বা তার বেশি সংস্করণে চালানোর সময় ExoPlayer ব্যবহার করতে পারেন এবং আগের সিস্টেমে MediaPlayer ব্যবহার করতে পারেন।

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

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