انتقال برنامه فرستنده Android از Cast SDK v2 به Cast Application Framework (CAF)

با دنبال کردن مراحل زیر می‌توانید برنامه فرستنده Android خود را از Cast SDK v2 به «فرستنده CAF» تبدیل کنید که براساس تک‌نسخه CastContext است.

Cast CAF Sender SDK از CastContext برای مدیریت GoogleAPIClient ازجانب شما استفاده می‌کند. ‫CastContext چرخه‌های حیات، خطاها، و فراخوانی‌های برگشتی را برای شما مدیریت می‌کند که این امر توسعه برنامه Cast را بسیار ساده می‌کند.

مقدمه

  • CAF Sender همچنان به‌عنوان بخشی از خدمات Google Play بااستفاده از مدیر کیت توسعه نرم‌افزار Android توزیع می‌شود
  • بسته‌های جدیدی اضافه شده است که مسئولیت رعایت کردن بازبینه طراحی Google Cast (com.google.android.gms.cast.framework.*) را برعهده می‌گیرد
  • «فرستنده CAF» ابزارک‌هایی ارائه می‌دهد که با الزامات «تجربه کاربری Cast» مطابقت دارند؛ نسخه ۲ هیچ عنصر واسط کاربری‌ای ارائه نمی‌داد و لازم بود این ابزارک‌ها را پیاده‌سازی کنید.
  • دیگر برای استفاده از Cast API نیازی به استفاده از GoogleApiClient نیست.
  • زیرنویس ناشنوایان در «فرستنده CAF» مشابه v2 است.

وابستگی‌ها

V2 و CAF همان وابستگی‌ها را به کتابخانه‌های پشتیبانی و خدمات Google Play (نسخه ۹.۲.۰ یا بالاتر) دارند که در راهنمای ویژگی‌های کتابخانه پشتیبانی توضیح داده شده است.

حداقل نسخه کیت توسعه نرم‌افزار Android که CAF پشتیبانی می‌کند ۹ (نان زنجبیلی) است.

راه‌اندازی

در 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>

CastContext را در روش onCreate هر «فعالیت» به‌صورت تنبل‌وار مقداردهی اولیه کنید:

private CastContext mCastContext;

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

    mCastContext = CastContext.getSharedInstance(this);
}

این مراحل در نسخه ۲ لازم نبود.

یافتن دستگاه

در CAF، فرایند کاوش وقتی برنامه به پیش‌زمینه می‌آید و به پس‌زمینه می‌رود، به‌ترتیب به‌طور خودکار توسط چارچوب شروع و متوقف می‌شود. نباید از MediaRouteSelector و MediaRouter.Callback استفاده شود.

دکمه «پخش محتوا» و کادر گفتگوی «پخش محتوا»

همانند نسخه ۲، این مؤلفه‌ها توسط کتابخانه پشتیبانی 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 برای اتصال MediaRouteButton به چارچوب Cast، روش 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;
}

وقتی کسی روی دکمه ضربه می‌زند، کادر گفتگوی «پخش محتوا» به‌طور خودکار ارائه می‌شود.

کنترل دستگاه

در CAF، کنترل دستگاه عمدتاً توسط چارچوب انجام می‌شود. برنامه فرستنده نیازی به مدیریت اتصال به دستگاه و راه‌اندازی برنامه «گیرنده وب» بااستفاده از GoogleApiClient ندارد (و نباید سعی کند این کار را انجام دهد). تعامل بین فرستنده و «گیرنده وب» اکنون به‌صورت «جلسه» نشان داده می‌شود. این SessionManager کلاس چرخه حیات جلسه را مدیریت می‌کند و جلسات را به‌طور خودکار در پاسخ به اشاره‌های کاربر شروع و متوقف می‌کند: جلسه زمانی شروع می‌شود که کاربر دستگاه «پخش محتوا» را در چارگوش «پخش محتوا» انتخاب کند و زمانی پایان می‌یابد که کاربر روی دکمه «توقف پخش محتوا» در چارگوش «پخش محتوا» ضربه بزند یا زمانی که برنامه فرستنده خود خاتمه یابد. برنامه فرستنده می‌تواند با ثبت SessionManagerListener در SessionManager از رویدادهای چرخه حیات جلسه مطلع شود. کاربردهای SessionManagerListener روش‌های بازخوانی را برای همه رویدادهای چرخه زندگی جلسه تعریف می‌کنند.

کلاس CastSession نشان‌دهنده جلسه‌ای با دستگاه Cast است. این کلاس روش‌هایی برای کنترل میزان صدای دستگاه و وضعیت بی‌صدا دارد که قبلاً در نسخه ۲ بااستفاده از روش‌های Cast.CastApi انجام می‌شد.

در نسخه ۲، Cast.Listener بازخوان‌ها اعلان‌های تغییرات وضعیت دستگاه را ارائه می‌دادند، ازجمله بلندی صدا، وضعیت بی‌صدا، وضعیت آماده به کار، و غیره.

در CAF، اعلان‌های تغییر وضعیت میزان صدا/بی‌صدا کردن هنوز ازطریق روش‌های فراخوانی در Cast.Listener ارسال می‌شوند؛ این شنوندگان با CastSession ثبت شده‌اند. همه اعلان‌های باقی‌مانده وضعیت دستگاه ازطریق CastStateListener فراخوانی‌های برگشتی ارائه می‌شوند؛ این شنوندگان با CastSession ثبت می‌شوند. مطمئن شوید که وقتی قطعه‌ها، فعالیت‌ها، یا برنامه‌های مرتبط به پس‌زمینه می‌روند، همچنان ثبت‌نام شنوندگان را لغو می‌کنید.

منطق اتصال مجدد

همانند نسخه ۲، CAF تلاش می‌کند اتصال‌های شبکه را که به‌دلیل قطع موقت سیگنال Wi-Fi یا سایر خطاهای شبکه قطع شده‌اند، دوباره برقرار کند. اکنون این کار در سطح جلسه انجام می‌شود؛ وقتی اتصال قطع می‌شود، جلسه می‌تواند وارد وضعیت «تعلیق‌شده» شود و وقتی اتصال برقرار می‌شود، به وضعیت «متصل» برمی‌گردد. این چارچوب مسئولیت اتصال مجدد به برنامه «گیرنده وب» و اتصال مجدد کانال‌های «پخش محتوا» را به‌عنوان بخشی از این فرایند برعهده دارد.

علاوه‌براین، CAF ازسرگیری خودکار جلسه را نیز اضافه می‌کند که به‌طور پیش‌فرض فعال است (و می‌توان آن را ازطریق CastOptions غیرفعال کرد. اگر برنامه فرستنده درحالی‌که جلسه «پخش محتوا» درحال انجام است به پس‌زمینه ارسال شود یا بسته شود (با کشیدن به کنار یا به‌دلیل خرابی)، چارچوب تلاش خواهد کرد تا وقتی برنامه فرستنده به پیش‌زمینه برمی‌گردد یا دوباره راه‌اندازی می‌شود، آن جلسه را ازسر بگیرد؛ این کار به‌طور خودکار توسط SessionManager انجام می‌شود که تماس‌های برگشتی مناسب را در هر نمونه SessionManagerListener ثبت‌شده صادر می‌کند.

ثبت کانال سفارشی

در نسخه ۲، کانال‌های سفارشی (پیاده‌سازی‌شده بااستفاده از Cast.MessageReceivedCallback) با Cast.CastApi ثبت می‌شوند. در CAF، کانال‌های سفارشی درعوض با نمونه CastSession ثبت می‌شوند. ثبت‌نام را می‌توان در روش SessionManagerListener.onSessionStarted بازخوانی انجام داد. برای برنامه‌های رسانه‌ای، دیگر لازم نیست کانال کنترل رسانه را به‌طور صریح ازطریق Cast.CastApi.setMessageReceivedCallbacks ثبت کنید؛ برای جزئیات بیشتر، بخش زیر را ببینید.

کنترل رسانه

کلاس v2 RemoteMediaPlayer منسوخ شده است و نباید استفاده شود. در CAF، کلاس جدید RemoteMediaClient جایگزین آن شده است که عملکردی معادل را در میانای برنامه‌سازی کاربردی راحت‌تری ارائه می‌دهد. لازم نیست این شیء را به‌طور صریح مقداردهی اولیه یا ثبت کنید؛ اگر برنامه «گیرنده وب» که به آن متصل می‌شوید از فضای نام رسانه پشتیبانی کند، چارچوب به‌طور خودکار شیء را نمونه‌سازی می‌کند و کانال رسانه زیرین را در زمان شروع جلسه ثبت می‌کند.

می‌توانید از RemoteMediaClient به‌عنوان روش getRemoteMediaClient شیء CastSession دسترسی پیدا کنید.

در نسخه ۲، همه درخواست‌های رسانه‌ای صادرشده در RemoteMediaPlayer ازطریق PendingResult تماس برگشتی RemoteMediaPlayer.MediaChannelResult را برمی‌گرداند.

در CAF، همه درخواست‌های رسانه‌ای صادرشده در RemoteMediaClient ازطریق RemoteMediaClient.MediaChannelResult ازطریق PendingResult تماس برگشتی برگردانده می‌شود که می‌توان از آن برای پیگیری پیشرفت و نتیجه نهایی درخواست استفاده کرد.

‫v2 RemoteMediaPlayer اعلان‌هایی درباره تغییرات در وضعیت پخش‌کننده رسانه در «گیرنده وب» ازطریق RemoteMediaPlayer.OnStatusUpdatedListener ارسال می‌کند.

در CAF، RemoteMediaClient ازطریق میانای RemoteMediaClient.Listener کاربرگ‌های تماس معادل ارائه می‌دهد. هر تعداد شنونده می‌تواند با RemoteMediaClient ثبت شود، که به چندین عنصر فرستنده اجازه می‌دهد نمونه واحد RemoteMediaClient را که با جلسه مرتبط است هم‌رسانی کنند.

در نسخه ۲، برنامه فرستنده باید بار همگام نگه داشتن میانای کاربر با وضعیت پخش‌کننده رسانه در «گیرنده وب» را برعهده می‌گرفت.

در CAF، کلاس UIMediaController بیشتر این مسئولیت را برعهده می‌گیرد.

رونهاد مقدماتی

V2 واسط کاربر رونهاد معرفی ارائه نمی‌دهد.

CAF نمای سفارشی IntroductoryOverlay ارائه می‌دهد تا دکمه «پخش محتوا» را وقتی برای اولین‌بار به کاربران نشان داده می‌شود برجسته کند.

کنترل‌کننده کوچک

در v2، باید یک کنترل‌کننده کوچک را از ابتدا در برنامه فرستنده پیاده‌سازی کنید.

در CAF، کیت توسعه نرم‌افزار نمای سفارشی‌ای ارائه می‌دهد، MiniControllerFragment، که می‌توانید آن را به فایل چیدمان برنامه فعالیت‌هایی که می‌خواهید کنترل‌کننده کوچک در آن‌ها نشان داده شود اضافه کنید.

اعلان و صفحه قفل

در نسخه ۲، کنترل‌کننده‌های اعلان و صفحه قفل توسط SDK ارائه نمی‌شوند. برای آن «کیت توسعه نرم‌افزار»، باید این ویژگی‌ها را بااستفاده از میاناهای برنامه‌سازی کاربردی چارچوب Android در برنامه فرستنده خود بسازید.

در CAF، «کیت توسعه نرم‌افزار» NotificationsOptions.Builder را ارائه می‌دهد تا به شما کمک کند کنترل‌های رسانه را برای اعلان و صفحه قفل در برنامه فرستنده بسازید. کنترل‌های اعلان و صفحه قفل را می‌توان با CastOptions هنگام مقداردهی اولیه CastContext فعال کرد.

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

کنترل‌کننده ازهم بازشده

در نسخه ۲، باید کنترل‌کننده گسترده را از ابتدا در برنامه فرستنده پیاده‌سازی کنید.

«چارچوب کنش» یک کلاس UIMediaController کمکی ارائه می‌دهد که ساختن کنترل‌کننده گسترده خودتان را برایتان آسان می‌کند.

‫CAF یک ابزارک کنترل‌کننده ازپیش ساخته‌شده گسترده اضافه می‌کند ExpandedControllerActivity که می‌توانید به‌سادگی به برنامه‌تان اضافه کنید. دیگر نیازی نیست کنترل‌کننده گسترده سفارشی را بااستفاده از UIMediaController پیاده‌سازی کنید.

فوکوس صدا

در نسخه ۲، برای مدیریت کردن تمرکز صوتی باید از MediaSessionCompat استفاده کنید.

در CAF، کانون صوتی به‌طور خودکار مدیریت می‌شود.

گزارش‌گیری اشکال‌زدایی

در CAF هیچ گزینه گزارش‌گیری وجود ندارد.

برنامه‌های نمونه

آموزش‌های گام‌به‌گام و برنامه‌های نمونه داریم که از CAF استفاده می‌کنند.