MediaRouteProvider ওভারভিউ

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

একটি রিসিভার ডিভাইসের জন্য কীভাবে একটি মিডিয়া রুট প্রদানকারী তৈরি করা যায় এবং Android এ চলা অন্যান্য মিডিয়া প্লেব্যাক অ্যাপ্লিকেশনগুলিতে এটি উপলব্ধ করা যায় এই নির্দেশিকাটি আলোচনা করে৷ এই API ব্যবহার করার জন্য, আপনাকে MediaRouteProvider , MediaRouteProviderDescriptor , এবং RouteController এর মূল ক্লাসগুলির সাথে পরিচিত হতে হবে।

ওভারভিউ

অ্যান্ড্রয়েড মিডিয়া রাউটার ফ্রেমওয়ার্ক মিডিয়া অ্যাপ ডেভেলপার এবং মিডিয়া প্লেব্যাক ডিভাইস নির্মাতাদের একটি সাধারণ API এবং সাধারণ ব্যবহারকারী ইন্টারফেসের মাধ্যমে সংযোগ করতে সক্ষম করে। যে অ্যাপ ডেভেলপাররা একটি MediaRouter ইন্টারফেস প্রয়োগ করে তারা ফ্রেমওয়ার্কের সাথে সংযোগ করতে পারে এবং মিডিয়া রাউটার ফ্রেমওয়ার্কে অংশগ্রহণকারী ডিভাইসগুলিতে সামগ্রী চালাতে পারে। মিডিয়া প্লেব্যাক ডিভাইস নির্মাতারা একটি MediaRouteProvider প্রকাশ করে ফ্রেমওয়ার্কে অংশগ্রহণ করতে পারে যা অন্যান্য অ্যাপ্লিকেশনগুলিকে রিসিভার ডিভাইসে মিডিয়ার সাথে সংযোগ করতে এবং চালাতে দেয়৷ চিত্র 1 ব্যাখ্যা করে কিভাবে একটি অ্যাপ মিডিয়া রাউটার ফ্রেমওয়ার্কের মাধ্যমে একটি রিসিভিং ডিভাইসের সাথে সংযোগ করে।

চিত্র 1. মিডিয়া রুট প্রদানকারীর ক্লাস কিভাবে একটি মিডিয়া অ্যাপ থেকে একটি রিসিভার ডিভাইসে যোগাযোগ প্রদান করে তার সংক্ষিপ্ত বিবরণ।

আপনি যখন আপনার রিসিভার ডিভাইসের জন্য একটি মিডিয়া রুট প্রদানকারী তৈরি করেন, তখন প্রদানকারী নিম্নলিখিত উদ্দেশ্যগুলি পূরণ করে:

  • রিসিভার ডিভাইসের ক্ষমতা বর্ণনা এবং প্রকাশ করুন যাতে অন্যান্য অ্যাপগুলি এটিকে আবিষ্কার করতে পারে এবং এর প্লেব্যাক বৈশিষ্ট্যগুলি ব্যবহার করতে পারে৷
  • ডিভাইসটিকে মিডিয়া রাউটার ফ্রেমওয়ার্কের সাথে সামঞ্জস্যপূর্ণ করতে রিসিভার ডিভাইসের প্রোগ্রামিং ইন্টারফেস এবং এর যোগাযোগ পরিবহন ব্যবস্থাকে মোড়ানো।

রুট প্রদানকারীদের বিতরণ

একটি মিডিয়া রুট প্রদানকারীকে একটি Android অ্যাপের অংশ হিসেবে বিতরণ করা হয়। আপনার রুট প্রদানকারীকে MediaRouteProviderService প্রসারিত করে বা আপনার নিজস্ব পরিষেবার সাথে MediaRouteProvider এর বাস্তবায়ন মোড়ানো এবং মিডিয়া রুট প্রদানকারীর জন্য একটি অভিপ্রায় ফিল্টার ঘোষণা করে অন্যান্য অ্যাপে উপলব্ধ করা যেতে পারে। এই পদক্ষেপগুলি অন্যান্য অ্যাপগুলিকে আপনার মিডিয়া রুট আবিষ্কার করতে এবং ব্যবহার করার অনুমতি দেয়৷

দ্রষ্টব্য: মিডিয়া রুট প্রদানকারী ধারণকারী অ্যাপটি রুট প্রদানকারীর কাছে একটি MediaRouter ইন্টারফেসও অন্তর্ভুক্ত করতে পারে, তবে এটির প্রয়োজন নেই।

মিডিয়ারাউটার সমর্থন লাইব্রেরি

মিডিয়া রাউটার APIগুলিকে AndroidX MediaRouter লাইব্রেরিতে সংজ্ঞায়িত করা হয়েছে আপনাকে অবশ্যই এই লাইব্রেরিটি আপনার অ্যাপ ডেভেলপমেন্ট প্রকল্পে যুক্ত করতে হবে৷ আপনার প্রকল্পে সমর্থন লাইব্রেরি যোগ করার বিষয়ে আরও তথ্যের জন্য, সমর্থন লাইব্রেরি সেটআপ দেখুন।

সতর্কতা: মিডিয়া রাউটার ফ্রেমওয়ার্কের AndroidX বাস্তবায়ন ব্যবহার করতে ভুলবেন না। পুরানো android.media প্যাকেজ ব্যবহার করবেন না।

একটি প্রদানকারী পরিষেবা তৈরি করা

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

নিম্নলিখিত উদাহরণ কোডটি একটি মিডিয়া রুট প্রদানকারী পরিষেবার ঘোষণা এবং একটি ম্যানিফেস্টে অভিপ্রায় ফিল্টার দেখায়, যা এটিকে মিডিয়া রাউটার ফ্রেমওয়ার্ক দ্বারা আবিষ্কার এবং ব্যবহার করার অনুমতি দেয়:

<service android:name=".provider.SampleMediaRouteProviderService"
    android:label="@string/sample_media_route_provider_service"
    android:process=":mrp">
    <intent-filter>
        <action android:name="android.media.MediaRouteProviderService" />
    </intent-filter>
</service>

এই ম্যানিফেস্ট উদাহরণটি এমন একটি পরিষেবা ঘোষণা করে যা প্রকৃত মিডিয়া রুট প্রদানকারীর ক্লাসগুলিকে আবৃত করে। অ্যান্ড্রয়েড মিডিয়া রাউটার ফ্রেমওয়ার্ক মিডিয়া রুট প্রদানকারীদের জন্য একটি পরিষেবা মোড়ক হিসাবে ব্যবহারের জন্য MediaRouteProviderService ক্লাস প্রদান করে। নিম্নলিখিত উদাহরণ কোড প্রদর্শন করে কিভাবে এই মোড়ক শ্রেণী ব্যবহার করতে হয়:

কোটলিন

class SampleMediaRouteProviderService : MediaRouteProviderService() {

    override fun onCreateMediaRouteProvider(): MediaRouteProvider {
        return SampleMediaRouteProvider(this)
    }
}

জাভা

public class SampleMediaRouteProviderService extends MediaRouteProviderService {

    @Override
    public MediaRouteProvider onCreateMediaRouteProvider() {
        return new SampleMediaRouteProvider(this);
    }
}

রুট ক্ষমতা নির্দিষ্ট করা

মিডিয়া রাউটার ফ্রেমওয়ার্কের সাথে সংযুক্ত অ্যাপগুলি আপনার অ্যাপের ম্যানিফেস্ট ঘোষণার মাধ্যমে আপনার মিডিয়া রুট আবিষ্কার করতে পারে, তবে আপনি যে মিডিয়া রুটগুলি প্রদান করছেন তার ক্ষমতাও তাদের জানতে হবে। মিডিয়া রুটগুলি বিভিন্ন ধরণের হতে পারে এবং বিভিন্ন বৈশিষ্ট্য থাকতে পারে এবং অন্যান্য অ্যাপগুলি আপনার রুটের সাথে সামঞ্জস্যপূর্ণ কিনা তা নির্ধারণ করতে এই বিবরণগুলি আবিষ্কার করতে সক্ষম হতে হবে৷

মিডিয়া রাউটার ফ্রেমওয়ার্ক আপনাকে IntentFilter অবজেক্ট, MediaRouteDescriptor অবজেক্ট এবং একটি MediaRouteProviderDescriptor এর মাধ্যমে আপনার মিডিয়া রুটের ক্ষমতাগুলি সংজ্ঞায়িত এবং প্রকাশ করতে দেয়। অন্যান্য অ্যাপের জন্য আপনার মিডিয়া রুটের বিশদ প্রকাশ করতে এই ক্লাসগুলি কীভাবে ব্যবহার করবেন তা এই বিভাগটি ব্যাখ্যা করে।

রুট বিভাগ

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

  • CATEGORY_LIVE_AUDIO — একটি সেকেন্ডারি আউটপুট ডিভাইসে অডিওর আউটপুট, যেমন একটি বেতার-সক্ষম মিউজিক সিস্টেম।
  • CATEGORY_LIVE_VIDEO — একটি সেকেন্ডারি আউটপুট ডিভাইসে ভিডিওর আউটপুট, যেমন ওয়্যারলেস ডিসপ্লে ডিভাইস।
  • CATEGORY_REMOTE_PLAYBACK — একটি পৃথক ডিভাইসে ভিডিও বা অডিও চালান যা মিডিয়া পুনরুদ্ধার, ডিকোডিং এবং প্লেব্যাক পরিচালনা করে, যেমন Chromecast ডিভাইস।

আপনার মিডিয়া রুটের বর্ণনায় এই সেটিংসগুলি অন্তর্ভুক্ত করার জন্য, আপনি এগুলিকে একটি IntentFilter অবজেক্টে সন্নিবেশ করান, যা আপনি পরে একটি MediaRouteDescriptor অবজেক্টে যোগ করুন:

কোটলিন

class SampleMediaRouteProvider(context: Context) : MediaRouteProvider(context) {

    companion object {
        private val CONTROL_FILTERS_BASIC: ArrayList<IntentFilter> = IntentFilter().run {
            addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
            arrayListOf(this)
        }
    }
}

জাভা

public final class SampleMediaRouteProvider extends MediaRouteProvider {
    private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;
    static {
        IntentFilter videoPlayback = new IntentFilter();
        videoPlayback.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
        CONTROL_FILTERS_BASIC = new ArrayList<IntentFilter>();
        CONTROL_FILTERS_BASIC.add(videoPlayback);
    }
}

আপনি যদি CATEGORY_REMOTE_PLAYBACK অভিপ্রায় নির্দিষ্ট করেন, তাহলে আপনাকে অবশ্যই সংজ্ঞায়িত করতে হবে যে মিডিয়ার ধরন এবং প্লেব্যাক নিয়ন্ত্রণগুলি আপনার মিডিয়া রুট প্রদানকারী দ্বারা সমর্থিত। পরবর্তী বিভাগে আপনার ডিভাইসের জন্য এই সেটিংস কিভাবে নির্দিষ্ট করতে হবে তা বর্ণনা করে।

মিডিয়া প্রকার এবং প্রোটোকল

একটি দূরবর্তী প্লেব্যাক ডিভাইসের জন্য একটি মিডিয়া রুট প্রদানকারীকে অবশ্যই মিডিয়ার ধরন এবং এটি সমর্থন করে এমন প্রোটোকল স্থানান্তর করতে হবে। আপনি সেই বস্তুর IntentFilter ক্লাস এবং addDataScheme() এবং addDataType() পদ্ধতি ব্যবহার করে এই সেটিংস নির্দিষ্ট করুন। নিম্নলিখিত কোড স্নিপেট দেখায় কিভাবে HTTP, https, এবং রিয়েল টাইম স্ট্রিমিং প্রোটোকল (RTSP) ব্যবহার করে দূরবর্তী ভিডিও প্লেব্যাক সমর্থন করার জন্য একটি অভিপ্রায় ফিল্টার সংজ্ঞায়িত করা যায়:

কোটলিন

class SampleMediaRouteProvider(context: Context) : MediaRouteProvider(context) {

    companion object {

        private fun IntentFilter.addDataTypeUnchecked(type: String) {
            try {
                addDataType(type)
            } catch (ex: IntentFilter.MalformedMimeTypeException) {
                throw RuntimeException(ex)
            }
        }

        private val CONTROL_FILTERS_BASIC: ArrayList<IntentFilter> = IntentFilter().run {
            addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
            addAction(MediaControlIntent.ACTION_PLAY)
            addDataScheme("http")
            addDataScheme("https")
            addDataScheme("rtsp")
            addDataTypeUnchecked("video/*")
            arrayListOf(this)
        }
    }
    ...
}

জাভা

public final class SampleMediaRouteProvider extends MediaRouteProvider {

    private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;

    static {
        IntentFilter videoPlayback = new IntentFilter();
        videoPlayback.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
        videoPlayback.addAction(MediaControlIntent.ACTION_PLAY);
        videoPlayback.addDataScheme("http");
        videoPlayback.addDataScheme("https");
        videoPlayback.addDataScheme("rtsp");
        addDataTypeUnchecked(videoPlayback, "video/*");
        CONTROL_FILTERS_BASIC = new ArrayList<IntentFilter>();
        CONTROL_FILTERS_BASIC.add(videoPlayback);
    }
    ...

    private static void addDataTypeUnchecked(IntentFilter filter, String type) {
        try {
            filter.addDataType(type);
        } catch (MalformedMimeTypeException ex) {
            throw new RuntimeException(ex);
        }
    }
}

প্লেব্যাক নিয়ন্ত্রণ

দূরবর্তী প্লেব্যাক অফার করে এমন একটি মিডিয়া রুট প্রদানকারীকে অবশ্যই এটি সমর্থন করে এমন মিডিয়া নিয়ন্ত্রণের ধরন নির্দিষ্ট করতে হবে। এগুলি হল সাধারণ ধরনের নিয়ন্ত্রণ যা মিডিয়া রুটগুলি প্রদান করতে পারে:

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

নিম্নলিখিত কোড উদাহরণটি দেখায় কিভাবে মৌলিক মিডিয়া রুট প্লেব্যাক নিয়ন্ত্রণ সমর্থন করার জন্য একটি অভিপ্রায় ফিল্টার তৈরি করতে হয়:

কোটলিন

class SampleMediaRouteProvider(context: Context) : MediaRouteProvider(context) {

    companion object {
        ...
        private val CONTROL_FILTERS_BASIC: ArrayList<IntentFilter> = run {
            val videoPlayback: IntentFilter = ...
            ...
            val playControls = IntentFilter().apply {
                addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
                addAction(MediaControlIntent.ACTION_SEEK)
                addAction(MediaControlIntent.ACTION_GET_STATUS)
                addAction(MediaControlIntent.ACTION_PAUSE)
                addAction(MediaControlIntent.ACTION_RESUME)
                addAction(MediaControlIntent.ACTION_STOP)
            }
            arrayListOf(videoPlayback, playControls)
        }
    }
    ...
}

জাভা

public final class SampleMediaRouteProvider extends MediaRouteProvider {
    private static final ArrayList<IntentFilter> CONTROL_FILTERS_BASIC;
    static {
        ...
        IntentFilter playControls = new IntentFilter();
        playControls.addCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK);
        playControls.addAction(MediaControlIntent.ACTION_SEEK);
        playControls.addAction(MediaControlIntent.ACTION_GET_STATUS);
        playControls.addAction(MediaControlIntent.ACTION_PAUSE);
        playControls.addAction(MediaControlIntent.ACTION_RESUME);
        playControls.addAction(MediaControlIntent.ACTION_STOP);
        CONTROL_FILTERS_BASIC = new ArrayList<IntentFilter>();
        CONTROL_FILTERS_BASIC.add(videoPlayback);
        CONTROL_FILTERS_BASIC.add(playControls);
    }
    ...
}

উপলব্ধ প্লেব্যাক নিয়ন্ত্রণ ইন্টেন্ট সম্পর্কে আরও তথ্যের জন্য, MediaControlIntent ক্লাস দেখুন।

MediaRouteProviderDescriptor

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

নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে পূর্বে তৈরি করা অভিপ্রায় ফিল্টারগুলিকে একটি MediaRouteProviderDescriptor এ যুক্ত করতে হয় এবং মিডিয়া রাউটার ফ্রেমওয়ার্ক দ্বারা ব্যবহারের জন্য বর্ণনাকারী সেট করতে হয়:

কোটলিন

class SampleMediaRouteProvider(context: Context) : MediaRouteProvider(context) {

    init {
        publishRoutes()
    }

    private fun publishRoutes() {
        val resources = context.resources
        val routeName: String = resources.getString(R.string.variable_volume_basic_route_name)
        val routeDescription: String = resources.getString(R.string.sample_route_description)
        // Create a route descriptor using previously created IntentFilters
        val routeDescriptor: MediaRouteDescriptor =
                MediaRouteDescriptor.Builder(VARIABLE_VOLUME_BASIC_ROUTE_ID, routeName)
                        .setDescription(routeDescription)
                        .addControlFilters(CONTROL_FILTERS_BASIC)
                        .setPlaybackStream(AudioManager.STREAM_MUSIC)
                        .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
                        .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
                        .setVolumeMax(VOLUME_MAX)
                        .setVolume(mVolume)
                        .build()
        // Add the route descriptor to the provider descriptor
        val providerDescriptor: MediaRouteProviderDescriptor =
                MediaRouteProviderDescriptor.Builder()
                        .addRoute(routeDescriptor)
                        .build()

        // Publish the descriptor to the framework
        descriptor = providerDescriptor
    }
    ...
}

জাভা

public SampleMediaRouteProvider(Context context) {
    super(context);
    publishRoutes();
}

private void publishRoutes() {
    Resources r = getContext().getResources();
    // Create a route descriptor using previously created IntentFilters
    MediaRouteDescriptor routeDescriptor = new MediaRouteDescriptor.Builder(
            VARIABLE_VOLUME_BASIC_ROUTE_ID,
            r.getString(R.string.variable_volume_basic_route_name))
            .setDescription(r.getString(R.string.sample_route_description))
            .addControlFilters(CONTROL_FILTERS_BASIC)
            .setPlaybackStream(AudioManager.STREAM_MUSIC)
            .setPlaybackType(MediaRouter.RouteInfo.PLAYBACK_TYPE_REMOTE)
            .setVolumeHandling(MediaRouter.RouteInfo.PLAYBACK_VOLUME_VARIABLE)
            .setVolumeMax(VOLUME_MAX)
            .setVolume(mVolume)
            .build();
    // Add the route descriptor to the provider descriptor
    MediaRouteProviderDescriptor providerDescriptor =
            new MediaRouteProviderDescriptor.Builder()
            .addRoute(routeDescriptor)
            .build();

    // Publish the descriptor to the framework
    setDescriptor(providerDescriptor);
}

উপলব্ধ বর্ণনাকারী সেটিংস সম্পর্কে আরও তথ্যের জন্য, MediaRouteDescriptor এবং MediaRouteProviderDescriptor এর জন্য রেফারেন্স ডকুমেন্টেশন দেখুন।

নিয়ন্ত্রণ রুট

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

মিডিয়া রাউটার ফ্রেমওয়ার্ক এই ক্লাসের একটি উদাহরণ পেতে আপনার রুট প্রদানকারীর onCreateRouteController() পদ্ধতিতে কল করে এবং তারপরে এটিতে অনুরোধ পাঠায়। এইগুলি হল MediaRouteProvider.RouteController ক্লাসের মূল পদ্ধতি, যা আপনাকে অবশ্যই আপনার মিডিয়া রুট প্রদানকারীর জন্য প্রয়োগ করতে হবে:

  • onSelect() — যখন একটি অ্যাপ্লিকেশন প্লেব্যাকের জন্য আপনার রুট নির্বাচন করে তখন কল করা হয়। মিডিয়া প্লেব্যাক শুরু হওয়ার আগে প্রয়োজন হতে পারে এমন কোনো প্রস্তুতিমূলক কাজ করতে আপনি এই পদ্ধতিটি ব্যবহার করেন।
  • onControlRequest() — গ্রহণকারী ডিভাইসে নির্দিষ্ট প্লেব্যাক কমান্ড পাঠায়।
  • onSetVolume() — প্লেব্যাক ভলিউম একটি নির্দিষ্ট মান সেট করার জন্য গ্রহণকারী ডিভাইসের কাছে একটি অনুরোধ পাঠায়।
  • onUpdateVolume() — একটি নির্দিষ্ট পরিমাণে প্লেব্যাক ভলিউম পরিবর্তন করার জন্য গ্রহীতা ডিভাইসের কাছে একটি অনুরোধ পাঠায়।
  • onUnselect() — যখন কোনো অ্যাপ্লিকেশন কোনো রুট নির্বাচন না করে তখন কল করা হয়।
  • onRelease() — যখন রুটটির আর ফ্রেমওয়ার্কের প্রয়োজন হয় না, তখন এটিকে এর সংস্থানগুলি মুক্ত করার অনুমতি দেয়।

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

কোটলিন

private class SampleRouteController : MediaRouteProvider.RouteController() {
    ...

    override fun onControlRequest(
            intent: Intent,
            callback: MediaRouter.ControlRequestCallback?
    ): Boolean {
        return if (intent.hasCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
            val action = intent.action
            when (action) {
                MediaControlIntent.ACTION_PLAY -> handlePlay(intent, callback)
                MediaControlIntent.ACTION_ENQUEUE -> handleEnqueue(intent, callback)
                MediaControlIntent.ACTION_REMOVE -> handleRemove(intent, callback)
                MediaControlIntent.ACTION_SEEK -> handleSeek(intent, callback)
                MediaControlIntent.ACTION_GET_STATUS -> handleGetStatus(intent, callback)
                MediaControlIntent.ACTION_PAUSE -> handlePause(intent, callback)
                MediaControlIntent.ACTION_RESUME -> handleResume(intent, callback)
                MediaControlIntent.ACTION_STOP -> handleStop(intent, callback)
                MediaControlIntent.ACTION_START_SESSION -> handleStartSession(intent, callback)
                MediaControlIntent.ACTION_GET_SESSION_STATUS ->
                    handleGetSessionStatus(intent, callback)
                MediaControlIntent.ACTION_END_SESSION -> handleEndSession(intent, callback)
                else -> false
            }.also {
                Log.d(TAG, sessionManager.toString())
            }
        } else {
            false
        }
    }
    ...
}

জাভা

private final class SampleRouteController extends
        MediaRouteProvider.RouteController {
    ...

    @Override
    public boolean onControlRequest(Intent intent, ControlRequestCallback callback) {

        String action = intent.getAction();

        if (intent.hasCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)) {
            boolean success = false;
            if (action.equals(MediaControlIntent.ACTION_PLAY)) {
                success = handlePlay(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_ENQUEUE)) {
                success = handleEnqueue(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_REMOVE)) {
                success = handleRemove(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_SEEK)) {
                success = handleSeek(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_GET_STATUS)) {
                success = handleGetStatus(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_PAUSE)) {
                success = handlePause(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_RESUME)) {
                success = handleResume(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_STOP)) {
                success = handleStop(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_START_SESSION)) {
                success = handleStartSession(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_GET_SESSION_STATUS)) {
                success = handleGetSessionStatus(intent, callback);
            } else if (action.equals(MediaControlIntent.ACTION_END_SESSION)) {
                success = handleEndSession(intent, callback);
            }

            Log.d(TAG, sessionManager.toString());
            return success;
        }
        return false;
    }
    ...
}

এটা বোঝা গুরুত্বপূর্ণ যে MediaRouteProvider.RouteController ক্লাসটি আপনার মিডিয়া প্লেব্যাক সরঞ্জামগুলিতে API-এর জন্য একটি মোড়ক হিসাবে কাজ করার উদ্দেশ্যে। এই শ্রেণীর পদ্ধতির বাস্তবায়ন সম্পূর্ণরূপে আপনার গ্রহণকারী ডিভাইস দ্বারা প্রদত্ত প্রোগ্রাম্যাটিক ইন্টারফেসের উপর নির্ভরশীল।

নমুনা কোড

MediaRouter নমুনা দেখায় কিভাবে একটি কাস্টম মিডিয়া রুট প্রদানকারী তৈরি করতে হয়।