নিম্নলিখিত পদ্ধতিটি ব্যবহার করে আপনি আপনার অ্যান্ড্রয়েড সেন্ডার অ্যাপটিকে Cast SDK v2 থেকে CAF Sender-এ রূপান্তর করতে পারবেন, যা CastContext সিঙ্গেলটনের উপর ভিত্তি করে নির্মিত।
Cast CAF Sender SDK আপনার হয়ে GoogleAPIClient পরিচালনা করার জন্য CastContext ব্যবহার করে। CastContext আপনার জন্য লাইফসাইকেল, ত্রুটি এবং কলব্যাকগুলি পরিচালনা করে, যা একটি Cast অ্যাপ তৈরি করাকে ব্যাপকভাবে সহজ করে তোলে।
ভূমিকা
- CAF Sender এখনও Android SDK ম্যানেজার ব্যবহার করে Google Play services-এর অংশ হিসেবে বিতরণ করা হয়।
- নতুন প্যাকেজ যুক্ত করা হয়েছে যা গুগল কাস্ট ডিজাইন চেকলিস্ট (
com.google.android.gms.cast.framework.*) মেনে চলার দায়িত্ব গ্রহণ করে। - CAF Sender এমন উইজেট সরবরাহ করে যা Cast UX-এর প্রয়োজনীয়তাগুলো মেনে চলে; v2 কোনো UI কম্পোনেন্ট সরবরাহ করত না এবং আপনাকে এই উইজেটগুলো ইমপ্লিমেন্ট করতে হতো।
- Cast API ব্যবহারের জন্য এখন আর GoogleApiClient ব্যবহারের প্রয়োজন নেই।
- CAF Sender-এর ক্লোজড ক্যাপশনিং v2-এর অনুরূপ।
নির্ভরশীলতা
সাপোর্ট লাইব্রেরি ফিচারস গাইডে বর্ণিত সাপোর্ট লাইব্রেরি এবং গুগল প্লে সার্ভিসেস (৯.২.০ বা তার পরবর্তী সংস্করণ)-এর উপর V2 এবং CAF-এর একই নির্ভরতা রয়েছে।
CAF দ্বারা সমর্থিত সর্বনিম্ন অ্যান্ড্রয়েড SDK সংস্করণ হলো ৯ (জিঞ্জারব্রেড)।
প্রারম্ভিকীকরণ
CAF-এ, Cast ফ্রেমওয়ার্কের জন্য একটি সুস্পষ্ট প্রারম্ভিক ধাপ প্রয়োজন। এর জন্য একটি উপযুক্ত OptionsProvider ব্যবহার করে Web Receiver অ্যাপ্লিকেশন আইডি এবং অন্য যেকোনো গ্লোবাল অপশন নির্দিষ্ট করে CastContext সিঙ্গেলটনটি ইনিশিয়ালাইজ করতে হয়।
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 ফাইলের 'application' ট্যাগের মধ্যে 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 ব্যবহার করে প্রতিটি Activity-র onCreateOptionMenu() মেথডকে ওভাররাইড করুন, যাতে MediaRouteButton Cast ফ্রেমওয়ার্কের সাথে সংযুক্ত করা যায়:
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 ব্যবহার করে ওয়েব রিসিভার অ্যাপ্লিকেশন চালু করার কাজটি পরিচালনা করার প্রয়োজন নেই (এবং এটি করার চেষ্টাও করা উচিত নয়)। প্রেরক এবং ওয়েব রিসিভারের মধ্যেকার মিথস্ক্রিয়া এখন একটি "সেশন" হিসাবে উপস্থাপিত হয়। SessionManager ক্লাসটি সেশনের জীবনচক্র পরিচালনা করে এবং ব্যবহারকারীর অঙ্গভঙ্গির প্রতিক্রিয়ায় স্বয়ংক্রিয়ভাবে সেশন শুরু ও বন্ধ করে: যখন ব্যবহারকারী কাস্ট ডায়ালগে একটি কাস্ট ডিভাইস নির্বাচন করেন তখন একটি সেশন শুরু হয় এবং যখন ব্যবহারকারী কাস্ট ডায়ালগে "Stop Casting" বোতামে ট্যাপ করেন বা যখন প্রেরক অ্যাপটি নিজেই বন্ধ হয়ে যায় তখন সেশনটি শেষ হয়। SessionManager এর সাথে একটি SessionManagerListener নিবন্ধন করার মাধ্যমে প্রেরক অ্যাপ্লিকেশনটিকে সেশনের জীবনচক্রের ইভেন্টগুলো সম্পর্কে অবহিত করা যেতে পারে। SessionManagerListener কলব্যাকগুলো সেশনের জীবনচক্রের সমস্ত ইভেন্টের জন্য কলব্যাক মেথড সংজ্ঞায়িত করে।
CastSession ক্লাসটি একটি Cast ডিভাইসের সাথে সেশনকে উপস্থাপন করে। এই ক্লাসে ডিভাইসটির ভলিউম এবং মিউট অবস্থা নিয়ন্ত্রণের জন্য মেথড রয়েছে, যা পূর্বে v2-তে Cast.CastApi এর মেথড ব্যবহার করে করা হতো।
v2-তে, Cast.Listener কলব্যাকগুলো ডিভাইসের অবস্থার পরিবর্তন, যেমন ভলিউম, মিউট অবস্থা, স্ট্যান্ডবাই স্ট্যাটাস ইত্যাদির নোটিফিকেশন দিত।
CAF-এ, ভলিউম/মিউট অবস্থার পরিবর্তনের নোটিফিকেশনগুলো এখনও Cast.Listener এর কলব্যাক মেথডের মাধ্যমে ডেলিভার করা হয়; এই লিসেনারগুলো CastSession সাথে রেজিস্টার করা থাকে। ডিভাইসের বাকি সমস্ত অবস্থার নোটিফিকেশন CastStateListener কলব্যাকের মাধ্যমে ডেলিভার করা হয়; এই লিসেনারগুলো CastSession সাথে রেজিস্টার করা থাকে। সংশ্লিষ্ট ফ্র্যাগমেন্ট, অ্যাক্টিভিটি বা অ্যাপগুলো ব্যাকগ্রাউন্ডে গেলে লিসেনারগুলো আনরেজিস্টার করতে ভুলবেন না।
পুনঃসংযোগ যুক্তি
v2-এর মতোই, CAF সাময়িক ওয়াইফাই সিগন্যাল হারানো বা অন্যান্য নেটওয়ার্ক ত্রুটির কারণে বিচ্ছিন্ন হওয়া নেটওয়ার্ক সংযোগগুলো পুনরায় স্থাপন করার চেষ্টা করে। এটি এখন সেশন পর্যায়ে করা হয়; সংযোগ বিচ্ছিন্ন হলে একটি সেশন "সাসপেন্ডেড" অবস্থায় যেতে পারে এবং সংযোগ পুনরুদ্ধার হলে আবার "কানেক্টেড" অবস্থায় ফিরে আসে। এই প্রক্রিয়ার অংশ হিসেবে ফ্রেমওয়ার্কটি ওয়েব রিসিভার অ্যাপ্লিকেশনের সাথে পুনরায় সংযোগ স্থাপন এবং যেকোনো কাস্ট চ্যানেল পুনরায় সংযোগ করার দায়িত্ব নেয়।
এছাড়াও, CAF স্বয়ংক্রিয়ভাবে সেশন পুনরায় চালু করার সুবিধা যোগ করে, যা ডিফল্টরূপে সক্রিয় থাকে (এবং CastOptions এর মাধ্যমে নিষ্ক্রিয় করা যায়)। একটি Cast সেশন চলাকালীন যদি প্রেরক অ্যাপ্লিকেশনটি ব্যাকগ্রাউন্ডে চলে যায় বা বন্ধ হয়ে যায় (সোয়াইপ করে সরিয়ে দেওয়ার কারণে বা ক্র্যাশের কারণে), তাহলে প্রেরক অ্যাপ্লিকেশনটি ফোরগ্রাউন্ডে ফিরে এলে বা পুনরায় চালু হলে ফ্রেমওয়ার্কটি সেই সেশনটি পুনরায় চালু করার চেষ্টা করবে; এটি SessionManager দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হয়, যা যেকোনো নিবন্ধিত SessionManagerListener ইনস্ট্যান্সে উপযুক্ত কলব্যাক জারি করবে।
কাস্টম চ্যানেল নিবন্ধন
v2-তে, কাস্টম চ্যানেল (যা Cast.MessageReceivedCallback ব্যবহার করে ইমপ্লিমেন্ট করা হয়) Cast.CastApi এর সাথে রেজিস্টার করা হয়। CAF-এ, কাস্টম চ্যানেলগুলো এর পরিবর্তে CastSession ইনস্ট্যান্সের সাথে রেজিস্টার করা হয়। এই রেজিস্ট্রেশনটি SessionManagerListener.onSessionStarted কলব্যাক মেথডে করা যেতে পারে। মিডিয়া অ্যাপ্লিকেশনগুলোর জন্য, Cast.CastApi.setMessageReceivedCallbacks এর মাধ্যমে মিডিয়া কন্ট্রোল চ্যানেলটি স্পষ্টভাবে রেজিস্টার করার আর প্রয়োজন নেই; আরও বিস্তারিত জানতে পরবর্তী সেকশনটি দেখুন।
মিডিয়া নিয়ন্ত্রণ
v2 ক্লাস RemoteMediaPlayer এখন আর ব্যবহার করা হয় না। CAF-এ, এর পরিবর্তে নতুন RemoteMediaClient ক্লাসটি এসেছে, যা আরও সুবিধাজনক API-এর মাধ্যমে সমতুল্য কার্যকারিতা প্রদান করে। এই অবজেক্টটি আলাদাভাবে ইনিশিয়ালাইজ বা রেজিস্টার করার প্রয়োজন নেই; যদি সংযুক্ত হওয়া ওয়েব রিসিভার অ্যাপ্লিকেশনটি মিডিয়া নেমস্পেস সমর্থন করে, তবে সেশন শুরু হওয়ার সময়ে ফ্রেমওয়ার্কটি স্বয়ংক্রিয়ভাবে অবজেক্টটি ইনস্ট্যানশিয়েট করবে এবং অন্তর্নিহিত মিডিয়া চ্যানেলটি রেজিস্টার করে দেবে।
CastSession অবজেক্টের getRemoteMediaClient মেথড ব্যবহার করে RemoteMediaClient কে অ্যাক্সেস করা যায়।
v2-তে, RemoteMediaPlayer এ পাঠানো সমস্ত মিডিয়া অনুরোধ একটি PendingResult কলব্যাকের মাধ্যমে RemoteMediaPlayer.MediaChannelResult ফেরত দিত।
CAF-এ, RemoteMediaClient এ জারি করা সমস্ত মিডিয়া অনুরোধ একটি PendingResult কলব্যাকের মাধ্যমে RemoteMediaClient.MediaChannelResult ফেরত দেয়, যা অনুরোধটির অগ্রগতি এবং চূড়ান্ত ফলাফল ট্র্যাক করতে ব্যবহার করা যেতে পারে।
v2 RemoteMediaPlayer RemoteMediaPlayer.OnStatusUpdatedListener এর মাধ্যমে ওয়েব রিসিভারে মিডিয়া প্লেয়ারের অবস্থার পরিবর্তন সম্পর্কে নোটিফিকেশন পাঠাতো।
CAF-এ, RemoteMediaClient তার RemoteMediaClient.Listener ইন্টারফেসের মাধ্যমে সমতুল্য কলব্যাক প্রদান করে। RemoteMediaClient এর সাথে যেকোনো সংখ্যক লিসেনার রেজিস্টার করা যেতে পারে, যা একাধিক প্রেরক কম্পোনেন্টকে সেশনের সাথে যুক্ত RemoteMediaClient এর একক ইনস্ট্যান্সটি শেয়ার করার সুযোগ দেয়।
v2-তে, প্রেরক অ্যাপ্লিকেশনটিকে ওয়েব রিসিভারের মিডিয়া প্লেয়ারের অবস্থার সাথে ইউজার ইন্টারফেসকে সিঙ্ক করে রাখার দায়িত্ব নিতে হতো।
CAF-এ, UIMediaController ক্লাসটি এই দায়িত্বের বেশিরভাগই পালন করে থাকে।
প্রারম্ভিক ওভারলে
V2-তে কোনো সূচনামূলক ওভারলে UI প্রদান করা হয় না।
ব্যবহারকারীদের কাছে প্রথমবার প্রদর্শিত হওয়ার সময় কাস্ট বাটনটিকে হাইলাইট করার জন্য CAF একটি কাস্টম ভিউ IntroductoryOverlay প্রদান করে।
মিনি কন্ট্রোলার
v2-তে, আপনাকে প্রেরক অ্যাপে একেবারে শুরু থেকে একটি মিনি কন্ট্রোলার তৈরি করতে হবে।
CAF-এ, SDK একটি কাস্টম ভিউ, MiniControllerFragment প্রদান করে, যা আপনি সেইসব অ্যাক্টিভিটির অ্যাপ লেআউট ফাইলে যোগ করতে পারেন যেখানে আপনি মিনি কন্ট্রোলারটি দেখাতে চান।
নোটিফিকেশন এবং লক স্ক্রিন
v2-তে, SDK-এর সাথে নোটিফিকেশন এবং লক স্ক্রিনের জন্য কন্ট্রোলার দেওয়া হয় না। সেই SDK-এর জন্য, আপনাকে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক 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 ব্যবহৃত কোডল্যাব টিউটোরিয়াল এবং স্যাম্পল অ্যাপ রয়েছে।