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

روش زیر به شما امکان می‌دهد برنامه فرستنده Android خود را از Cast SDK v2 به CAF Sender تبدیل کنید، که براساس CastContext سینگلتون است.

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

مقدمه

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

وابستگی‌ها

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

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

راه‌اندازی

در 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 را در برچسب «application» فایل 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 نباید استفاده شوند.

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

As in v2, these components are provided by the MediaRouter support library.

دکمه «پخش محتوا» همچنان توسط 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() هر «فعالیت» را لغو کنید تا 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 چرخه حیات جلسه را مدیریت می‌کند و به‌طور خودکار جلسه‌ها را در پاسخ به اشاره‌های کاربر شروع و متوقف می‌کند: وقتی کاربر دستگاه Cast را در کادر گفتگوی Cast انتخاب می‌کند، جلسه شروع می‌شود و وقتی کاربر روی دکمه «توقف ارسال محتوا» در کادر گفتگوی Cast تک‌ضرب می‌زند یا وقتی خود برنامه فرستنده خاتمه می‌یابد، جلسه پایان می‌یابد. برنامه فرستنده می‌تواند با ثبت کردن SessionManagerListener در SessionManager، از رویدادهای چرخه حیات جلسه مطلع شود. SessionManagerListener callbacks define callback methods for all session lifecycle events.

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

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

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

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

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

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

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

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

کنترل رسانه

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

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

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

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

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

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

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

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

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

نسخه ۲ واسط کاربر رونهاد مقدماتی ارائه نمی‌دهد.

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

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

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

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

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

در نسخه ۲، کنترل‌کننده‌های اعلان و صفحه قفل توسط کیت توسعه نرم‌افزار ارائه نمی‌شوند. برای آن کیت توسعه نرم‌افزار، باید این ویژگی‌ها را بااستفاده از میاناهای برنامه‌سازی کاربردی چارچوب 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();
}

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

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

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

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

فوکوس صدا

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

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

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

در CAF هیچ گزینه ثبت وقایعی وجود ندارد.

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

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