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

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

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

مقدمه

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

وابستگی‌ها

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

حداقل نسخه SDK اندروید که 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 هر اکتیویتی به صورت تنبل (lazily) :

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 ارائه می‌شوند.

دکمه‌ی Cast همچنان توسط MediaRouteButton پیاده‌سازی شده است و می‌تواند به عنوان یک آیتم منو در منوی شما (با استفاده از ActionBar یا Toolbar ) به activity شما اضافه شود.

<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() هر Activity را بازنویسی کنید:

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، کنترل دستگاه تا حد زیادی توسط چارچوب انجام می‌شود. برنامه فرستنده نیازی به مدیریت (و نباید سعی در مدیریت) اتصال به دستگاه و راه‌اندازی برنامه گیرنده وب با استفاده از GoogleApiClient ندارد. تعامل بین فرستنده و گیرنده وب اکنون به عنوان یک "جلسه" نمایش داده می‌شود. کلاس SessionManager چرخه حیات جلسه را مدیریت می‌کند و به طور خودکار جلسات را در پاسخ به حرکات کاربر شروع و متوقف می‌کند: یک جلسه زمانی شروع می‌شود که کاربر یک دستگاه Cast را در کادر محاوره‌ای Cast انتخاب کند و زمانی پایان می‌یابد که کاربر روی دکمه "توقف Cast" در کادر محاوره‌ای Cast ضربه بزند یا زمانی که خود برنامه فرستنده خاتمه می‌یابد. برنامه فرستنده می‌تواند با ثبت یک SessionManagerListener در SessionManager از رویدادهای چرخه حیات جلسه مطلع شود. فراخوانی‌های SessionManagerListener متدهای فراخوانی را برای همه رویدادهای چرخه حیات جلسه تعریف می‌کنند.

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

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

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

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

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

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

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

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

کنترل رسانه

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

RemoteMediaClient را می‌توان از طریق متد getRemoteMediaClient از شیء CastSession مورد دسترسی قرار داد.

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

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

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

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

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

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

پوشش مقدماتی

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

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

مینی کنترلر

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

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

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

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

در CAF، SDK یک 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 استفاده می‌کنند.