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

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

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

معرفی

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

وابستگی ها

V2 و CAF وابستگی های یکسانی به کتابخانه های پشتیبانی و خدمات Google Play (9.2.0 یا جدیدتر) دارند که در راهنمای ویژگی های کتابخانه پشتیبانی توضیح داده شده است.

حداقل نسخه Android SDK که CAF پشتیبانی می کند 9 (نان زنجبیلی) است.

مقداردهی اولیه

در CAF، یک مرحله اولیه سازی صریح برای چارچوب Cast مورد نیاز است. این شامل مقداردهی اولیه CastContext singleton، با استفاده از یک OptionsProvider مناسب برای تعیین شناسه برنامه Web Receiver و هر گزینه جهانی دیگر است.

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 هر Activity مقداردهی کنید:

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 نباید استفاده شوند.

دکمه Cast و گفتگوی Cast

مانند نسخه 2، این مؤلفه ها توسط کتابخانه پشتیبانی MediaRouter ارائه شده است.

دکمه Cast هنوز توسط 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"/>

روش onCreateOptionMenu() هر Activity را با استفاده از CastButtonFactory برای سیم‌کشی 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;
}

وقتی شخصی روی دکمه ضربه می زند، گفتگوی Cast به طور خودکار نمایش داده می شود.

کنترل دستگاه

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

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

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

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

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

مانند نسخه 2، CAF تلاش می کند تا اتصالات شبکه ای را که به دلیل از دست دادن موقت سیگنال WiFi یا سایر خطاهای شبکه از بین رفته اند، دوباره برقرار کند. این اکنون در سطح جلسه انجام می شود. یک جلسه می تواند زمانی که اتصال قطع می شود وارد حالت "تعلیق" شود و با بازیابی اتصال به حالت "متصل" برمی گردد. این فریم ورک از اتصال مجدد به برنامه Web Receiver و اتصال مجدد هر کانال Cast به عنوان بخشی از این فرآیند مراقبت می کند.

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

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

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

کنترل رسانه ها

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

RemoteMediaClient می تواند به عنوان متد getRemoteMediaClient شی CastSession قابل دسترسی باشد.

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

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

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

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

در نسخه 2، برنامه فرستنده باید مسئولیت همگام نگه داشتن رابط کاربری با وضعیت پخش کننده رسانه در گیرنده وب را بر عهده می گرفت.

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

پوشش مقدماتی

V2 رابط کاربری همپوشانی مقدماتی ارائه نمی دهد.

CAF یک نمای سفارشی IntroductoryOverlay برای برجسته کردن دکمه Cast هنگامی که برای اولین بار به کاربران نشان داده می شود، ارائه می دهد.

مینی کنترلر

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

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

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

در نسخه 2، کنترل‌کننده‌های اعلان و صفحه قفل توسط 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();
}

کنترلر گسترش یافته

در نسخه 2، باید یک کنترلر توسعه یافته را از ابتدا در برنامه فرستنده پیاده سازی کنید.

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

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

فوکوس صوتی

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

در CAF، فوکوس صوتی به صورت خودکار مدیریت می شود.

ثبت اشکال زدایی

در CAF هیچ گزینه ورود به سیستم وجود ندارد.

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

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