Cast SDK v2 থেকে Cast অ্যাপ্লিকেশন ফ্রেমওয়ার্কে (CAF) Android প্রেরক অ্যাপ মাইগ্রেট করা

নিম্নলিখিত পদ্ধতি আপনাকে Cast SDK v2 থেকে CAF Sender-এ Android প্রেরক অ্যাপ কনভার্ট করতে দেয়, যা CastContext সিঙ্গেলটনের উপর ভিত্তি করে তৈরি।

Cast CAF Sender SDK আপনার হয়ে GoogleAPIClient ম্যানেজ করতে CastContext ব্যবহার করে। CastContext আপনার জন্য লাইফসাইকেল, সমস্যা ও কলব্যাক ম্যানেজ করে, যা Cast অ্যাপ ডেভেলপ করার প্রক্রিয়াকে অনেক সহজ করে দেয়।

ভূমিকা

  • Android SDK ম্যানেজার ব্যবহার করে Google Play পরিষেবার অংশ হিসেবে CAF Sender এখনও ডিস্ট্রিবিউট করা হয়
  • নতুন প্যাকেজ যোগ করা হয়েছে যা Google Cast ডিজাইন চেকলিস্ট (com.google.android.gms.cast.framework.*) মেনে চলার দায়িত্ব নেয়
  • CAF প্রেরক Cast UX-এর প্রয়োজনীয়তা মেনে চলে এমন উইজেট প্রদান করে; v2 কোনও UI কম্পোনেন্ট প্রদান করেনি এবং আপনাকে এইসব উইজেট প্রয়োগ করতে হবে।
  • Cast API ব্যবহার করার জন্য GoogleApiClient ব্যবহার করার আর প্রয়োজন নেই।
  • CAF প্রেরকে ক্লোজড ক্যাপশনিং v2-এর মতোই।

ডিপেন্ডেন্সি

V2 এবং CAF-এর সাপোর্ট লাইব্রেরি এবং Google Play পরিষেবার (9.2.0 বা তার পরের ভার্সন) উপর একই নির্ভরতা আছে, যেমনটি সাপোর্ট লাইব্রেরি ফিচার গাইড-এ বর্ণনা করা হয়েছে

CAF-এ কাজ করে এমন Android SDK-এর ন্যূনতম ভার্সন হল ৯ (জিঞ্জারব্রেড)।

শুরু করা

CAF-এ, Cast ফ্রেমওয়ার্কের জন্য একটি স্পষ্ট ইনিশিয়ালাইজেশন ধাপ প্রয়োজন। এর মধ্যে CastContext সিঙ্গলটন ইনিশিয়ালাইজ করা, OptionsProvider ব্যবহার করে ওয়েব রিসিভার অ্যাপ্লিকেশন আইডি ও অন্যান্য গ্লোবাল বিকল্প নির্দিষ্ট করা অন্তর্ভুক্ত।

public class CastOptionsProvider implements OptionsProvider {

    @Override
    public CastOptions getCastOptions(Context context) {
        return new CastOptions.Builder()
                .setReceiverApplicationId(context.getString(R.string.app_id))
                .build();
    }

    @Override
    public List<SessionProvider> getAdditionalSessionProviders(Context context) {
        return null;
    }
}

অ্যাপের "অ্যাপ্লিকেশন" ট্যাগের মধ্যে OptionsProvider ঘোষণা করুন AndroidManifest.xml ফাইল:

<application>
...
    <meta-data
        android:name=
            "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
        android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />
</application>

প্রতিটি অ্যাক্টিভিটির onCreate পদ্ধতিতে CastContext অলসভাবে শুরু করুন:

private CastContext mCastContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_browser);
    setupActionBar();

    mCastContext = CastContext.getSharedInstance(this);
}

v2-তে এইসব ধাপের প্রয়োজন ছিল না।

ডিভাইস খুঁজে পাওয়া

CAF-এ, অ্যাপটি ফোরগ্রাউন্ডে এলে এবং ব্যাকগ্রাউন্ডে গেলে, ফ্রেমওয়ার্কের মাধ্যমে আবিষ্কার প্রক্রিয়াটি যথাক্রমে অটোমেটিক শুরু এবং বন্ধ হয়ে যায়। MediaRouteSelector এবং MediaRouter.Callback ব্যবহার করা উচিত নয়।

কাস্ট করার বোতাম ও কাস্ট ডায়ালগ

v2-এর মতো, এইসব কম্পোনেন্ট MediaRouter সাপোর্ট লাইব্রেরি প্রদান করে।

'কাস্ট করুন' বোতামটি এখনও MediaRouteButton দ্বারা প্রয়োগ করা হয় এবং আপনার অ্যাক্টিভিটিতে (একটি ActionBar বা একটি Toolbar ব্যবহার করে), আপনার মেনুতে একটি মেনু আইটেম হিসাবে যোগ করা যেতে পারে।

<item
    android:id="@+id/media_route_menu_item"
    android:title="@string/media_route_menu_title"
    app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
    app:showAsAction="always"/>

MediaRouteButton-কে Cast ফ্রেমওয়ার্কের সাথে যুক্ত করতে CastButtonFactory ব্যবহার করে প্রতিটি অ্যাক্টিভিটির onCreateOptionMenu() পদ্ধতি ওভাররাইড করুন:

private MenuItem mediaRouteMenuItem;

public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.browse, menu);
    mediaRouteMenuItem =
        CastButtonFactory.setUpMediaRouteButton(getApplicationContext(),
                                                menu,
                                                R.id.media_route_menu_item);
    return true;
}

কেউ বোতামে ট্যাপ করলে, Cast ডায়ালগ অটোমেটিক দেখানো হয়।

ডিভাইস কন্ট্রোল

CAF-এ, ডিভাইস কন্ট্রোল মূলত ফ্রেমওয়ার্কের মাধ্যমে ম্যানেজ করা হয়। প্রেরক অ্যাপ্লিকেশনকে ডিভাইসের সাথে কানেক্ট করা এবং GoogleApiClient ব্যবহার করে Web Receiver অ্যাপ্লিকেশন লঞ্চ করার বিষয়টি ম্যানেজ করতে হবে না (এবং ম্যানেজ করার চেষ্টাও করা উচিত নয়)। প্রেরক ও ওয়েব রিসিভারের মধ্যে ইন্টার‍্যাকশন এখন "সেশন" হিসেবে দেখানো হয়। SessionManager ক্লাস সেশন লাইফসাইকেল ম্যানেজ করে এবং ব্যবহারকারীর জেসচারের উত্তরে অটোমেটিক সেশন শুরু ও বন্ধ করে: ব্যবহারকারী Cast ডায়ালগে Cast ডিভাইস বেছে নিলে সেশন শুরু হয় এবং ব্যবহারকারী Cast ডায়ালগে "কাস্টিং বন্ধ করুন" বোতামে ট্যাপ করলে অথবা প্রেরক অ্যাপ নিজে থেকে বন্ধ হয়ে গেলে সেশন শেষ হয়। SessionManager-এর সাথে SessionManagerListener রেজিস্টার করার মাধ্যমে প্রেরক অ্যাপ্লিকেশনকে সেশন লাইফসাইকেল ইভেন্ট সম্পর্কে বিজ্ঞপ্তি পাঠানো যেতে পারে। SessionManagerListener কলব্যাক, সব সেশন লাইফসাইকেল ইভেন্টের জন্য কলব্যাক পদ্ধতি নির্ধারণ করে।

CastSession ক্লাসটি Cast ডিভাইসের সাথে একটি সেশনকে উপস্থাপন করে। ক্লাসে ডিভাইসের ভলিউম এবং মিউট স্টেট কন্ট্রোল করার পদ্ধতি আছে, যা আগে v2-তে Cast.CastApi-এর পদ্ধতি ব্যবহার করে করা হতো।

v2-তে, Cast.Listener কলব্যাক ডিভাইসের স্ট্যাটাসে হওয়া পরিবর্তনের বিজ্ঞপ্তি প্রদান করে, যার মধ্যে ভলিউম, মিউট স্ট্যাটাস, স্ট্যান্ডবাই স্ট্যাটাস এবং আরও অনেক কিছু অন্তর্ভুক্ত।

CAF-এ, ভলিউম/মিউট স্ট্যাটাস পরিবর্তন সংক্রান্ত বিজ্ঞপ্তি এখনও Cast.Listener-এ কলব্যাক পদ্ধতির মাধ্যমে ডেলিভার করা হয়; এই লিসেনারগুলি CastSession-এর সাথে রেজিস্টার করা হয়। বাকি সব ডিভাইসের স্ট্যাটাস সংক্রান্ত বিজ্ঞপ্তি CastStateListener কলব্যাকের মাধ্যমে পাঠানো হয়; এইসব লিসেনার CastSession-এর সাথে রেজিস্টার করা হয়। সংশ্লিষ্ট ফ্র্যাগমেন্ট, অ্যাক্টিভিটি বা অ্যাপ ব্যাকগ্রাউন্ডে চলে গেলেও আপনি এখনও লিসেনার আনরেজিস্টার করছেন কিনা তা নিশ্চিত করুন।

রিকানেকশন লজিক

v2-এর মতো, CAF নেটওয়ার্ক কানেকশন আবার স্থাপন করার চেষ্টা করে যা সাময়িকভাবে ওয়াই-ফাই সিগন্যাল হারিয়ে যাওয়া বা অন্যান্য নেটওয়ার্ক সমস্যার কারণে হারিয়ে যায়। এটি এখন সেশন লেভেলে করা হয়; কানেকশন হারিয়ে গেলে সেশন "সাসপেন্ড" অবস্থায় চলে যেতে পারে এবং কানেক্টিভিটি ফিরে এলে আবার "কানেক্টেড" অবস্থায় ফিরে আসবে। ফ্রেমওয়ার্কটি এই প্রসেসের অংশ হিসেবে Web Receiver অ্যাপ্লিকেশনের সাথে আবার কানেক্ট করা এবং যেকোনও Cast চ্যানেলের সাথে আবার কানেক্ট করার বিষয়টি ম্যানেজ করে।

এছাড়াও, CAF অটোমেটিক সেশন রিজাম্পশন যোগ করে যা ডিফল্ট হিসেবে চালু করা থাকে (এবং CastOptions-এর মাধ্যমে বন্ধ করা যায়। কাস্ট সেশন চলাকালীন প্রেরক অ্যাপ্লিকেশন ব্যাকগ্রাউন্ডে পাঠানো হলে বা বন্ধ হয়ে গেলে (সোয়াইপ-অ্যাওয়ে বা ক্র্যাশ হওয়ার কারণে), প্রেরক অ্যাপ্লিকেশন ফোরগ্রাউন্ডে ফিরে এলে বা আবার চালু হলে ফ্রেমওয়ার্ক সেই সেশন আবার শুরু করার চেষ্টা করবে; এটি SessionManager অটোমেটিক ম্যানেজ করে, যা যেকোনও রেজিস্টার করা SessionManagerListener ইনস্ট্যান্সে উপযুক্ত কলব্যাক ইস্যু করবে।

কাস্টম চ্যানেল রেজিস্ট্রেশন

v2-তে, কাস্টম চ্যানেল ( Cast.MessageReceivedCallback ব্যবহার করে প্রয়োগ করা হয়) Cast.CastApi-এর সাথে রেজিস্টার করা হয়। CAF-এ, কাস্টম চ্যানেলগুলি পরিবর্তে CastSession ইনস্ট্যান্সের সাথে রেজিস্টার করা হয়। SessionManagerListener.onSessionStarted কলব্যাক পদ্ধতিতে রেজিস্ট্রেশন করা যেতে পারে। মিডিয়া অ্যাপ্লিকেশনের জন্য, Cast.CastApi.setMessageReceivedCallbacks-এর মাধ্যমে মিডিয়া কন্ট্রোল চ্যানেল স্পষ্টভাবে রেজিস্টার করার আর প্রয়োজন নেই; আরও বিবরণের জন্য নিম্নলিখিত বিভাগ দেখুন।

মিডিয়া নিয়ন্ত্রণ

v2 ক্লাস RemoteMediaPlayer বন্ধ হয়ে গেছে এবং ব্যবহার করা যাবে না। CAF-এ, এটি নতুন RemoteMediaClient ক্লাস দ্বারা স্থান অধিকার করা হয়, যা আরও সুবিধাজনক API-তে সমতুল্য কার্যকারিতা প্রদান করে। এই অবজেক্টটি স্পষ্টভাবে ইনিশিয়ালাইজ বা রেজিস্টার করার প্রয়োজন নেই; সেশন শুরু হওয়ার সময় ফ্রেমওয়ার্ক অটোমেটিক অবজেক্টটি ইনস্ট্যান্টিয়েট করবে এবং অন্তর্নিহিত মিডিয়া চ্যানেল রেজিস্টার করবে, যদি কানেক্ট করা ওয়েব রিসিভার অ্যাপ্লিকেশন মিডিয়া নেমস্পেস সাপোর্ট করে।

RemoteMediaClient, CastSession অবজেক্টের getRemoteMediaClient পদ্ধতি হিসেবে অ্যাক্সেস করা যেতে পারে।

v2-এ, RemoteMediaPlayer-এ ইস্যু করা সব মিডিয়া অনুরোধ PendingResult কলব্যাকের মাধ্যমে RemoteMediaPlayer.MediaChannelResult ফিরিয়ে দেবে।

CAF-এ, RemoteMediaClient-এ ইস্যু করা সমস্ত মিডিয়া অনুরোধ একটি RemoteMediaClient.MediaChannelResult ফেরত দেয় PendingResult কলব্যাকের মাধ্যমে যা অনুরোধের অগ্রগতি এবং চূড়ান্ত ফলাফল ট্র্যাক করতে ব্যবহার করা যেতে পারে।

v2 RemoteMediaPlayer, RemoteMediaPlayer.OnStatusUpdatedListener-এর মাধ্যমে ওয়েব রিসিভারে মিডিয়া প্লেয়ারের স্ট্যাটাসে পরিবর্তন সম্পর্কে বিজ্ঞপ্তি পাঠাবে।

CAF-এ, RemoteMediaClient তার RemoteMediaClient.Listener ইন্টারফেসের মাধ্যমে সমতুল্য কলব্যাক প্রদান করে। RemoteMediaClient-এর সাথে যেকোনও সংখ্যক শ্রোতা রেজিস্টার করতে পারবেন, যার ফলে একাধিক প্রেরক কম্পোনেন্ট সেশনের সাথে যুক্ত RemoteMediaClient-এর একক ইনস্ট্যান্স শেয়ার করতে পারবেন।

v2-তে, প্রেরক অ্যাপ্লিকেশনকে ওয়েব রিসিভারে মিডিয়া প্লেয়ারের অবস্থার সাথে ব্যবহারকারী ইন্টারফেসকে সিঙ্কে রাখার বোঝা নিতে হয়েছিল।

CAF-এ, ক্লাস UIMediaController এই দায়িত্বের বেশিরভাগটাই পালন করে।

ভূমিকা সংক্রান্ত ওভারলে

V2-তে কোনও ইন্ট্রোডাক্টরি ওভারলে UI নেই।

CAF একটি কাস্টম ভিউ প্রদান করে IntroductoryOverlay ব্যবহারকারীদের প্রথমবার দেখানোর সময় কাস্ট করার বোতামটি হাইলাইট করতে।

মিনি কন্ট্রোলার

v2-তে, আপনাকে প্রেরক অ্যাপে স্ক্র্যাচ থেকে একটি মিনি কন্ট্রোলার প্রয়োগ করতে হবে।

CAF-এ, SDK একটি কাস্টম ভিউ প্রদান করে, MiniControllerFragment, যা আপনি সেইসব অ্যাক্টিভিটির অ্যাপ লেআউট ফাইলে যোগ করতে পারেন, যেখানে আপনি মিনি কন্ট্রোলার দেখাতে চান।

বিজ্ঞপ্তি ও লক স্ক্রিন

v2-এ, বিজ্ঞপ্তি ও লক স্ক্রিনের জন্য কন্ট্রোলার SDK-এর মাধ্যমে প্রদান করা হয় না। সেই SDK-এর জন্য, আপনাকে Android ফ্রেমওয়ার্ক API ব্যবহার করে আপনার প্রেরক অ্যাপে এইসব ফিচার তৈরি করতে হবে।

CAF-এ, SDK একটি NotificationsOptions.Builder প্রদান করে যা আপনাকে প্রেরক অ্যাপে বিজ্ঞপ্তি এবং লক স্ক্রিনের জন্য মিডিয়া কন্ট্রোল তৈরি করতে সাহায্য করে। CastContext শুরু করার সময় CastOptions ব্যবহার করে বিজ্ঞপ্তি এবং লক স্ক্রিন কন্ট্রোল চালু করা যেতে পারে।

public CastOptions getCastOptions(Context context) {
    NotificationOptions notificationOptions = new NotificationOptions.Builder()
            .setTargetActivityClassName(VideoBrowserActivity.class.getName())
            .build();
    CastMediaOptions mediaOptions = new CastMediaOptions.Builder()
            .setNotificationOptions(notificationOptions)
            .build();

    return new CastOptions.Builder()
            .setReceiverApplicationId(context.getString(R.string.app_id))
            .setCastMediaOptions(mediaOptions)
            .build();
}

বড় করা কন্ট্রোলার

v2-তে, আপনাকে প্রেরক অ্যাপে স্ক্র্যাচ থেকে একটি এক্সপ্যান্ডেড কন্ট্রোলার প্রয়োগ করতে হবে।

CAF একটি UIMediaController সহায়ক ক্লাস প্রদান করে যা আপনার নিজের এক্সপ্যান্ডেড কন্ট্রোলার তৈরি করা সহজ করে তোলে।

CAF একটি প্রি-বিল্ট এক্সপ্যান্ডেড কন্ট্রোলার উইজেট যোগ করে ExpandedControllerActivity যা আপনি সহজেই আপনার অ্যাপে যোগ করতে পারবেন। আপনাকে আর UIMediaController ব্যবহার করে কাস্টম এক্সপ্যান্ডেড কন্ট্রোলার প্রয়োগ করতে হবে না।

অডিও ফোকাস

v2-এ, অডিও ফোকাস ম্যানেজ করতে আপনাকে MediaSessionCompat ব্যবহার করতে হবে।

CAF-এ, অডিও ফোকাস অটোমেটিক ম্যানেজ করা হয়।

ডিবাগ লগিং

CAF-এ লগিংয়ের কোনও বিকল্প নেই।

স্যাম্পেল অ্যাপ

আমাদের কাছে কোডল্যাব টিউটোরিয়াল এবং স্যাম্পেল অ্যাপ আছে যা CAF ব্যবহার করে।