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

নিচের পদ্ধতি অনুসরণ করে আপনি নিজের Android প্রেরক অ্যাপকে Cast SDK v2 থেকে CAF প্রেরকে কনভার্ট করতে পারবেন, এটি CastContext সিঙ্গেলটনের উপর ভিত্তি করে তৈরি।

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

ভূমিকা

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

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

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

CAF-এ কাজ করে এমন ন্যূনতম Android SDK ভার্সন হল 9 (Gingerbread)।

ইনিশিয়ালাইজেশন

CAF-এ, Cast ফ্রেমওয়ার্কের জন্য একটি স্পষ্ট ইনিশিয়ালাইজেশন ধাপ প্রয়োজন। এর মধ্যে CastContext সিঙ্গেলটনকে ইনিশিয়ালাইজ করা, Web Receiver অ্যাপ্লিকেশন আইডি ও অন্য যেকোনও গ্লোবাল বিকল্প নির্দিষ্ট করতে উপযুক্ত 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;
    }
}

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

<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"/>

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

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;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

v2 RemoteMediaPlayer, Web Receiver-এ মিডিয়া প্লেয়ারের স্ট্যাটাসে হওয়া পরিবর্তন সম্পর্কে বিজ্ঞপ্তি 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-এ কোনও লগিং বিকল্প নেই।

Sample apps

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