نقل بيانات تطبيق Android Sender من الإصدار 2 من Cast SDK إلى إطار عمل تطبيق Cast (CAF)

يمكّنك الإجراء التالي من تحويل تطبيق المرسل على Android من Cast الإصدار 2 من حزمة تطوير البرامج (SDK) إلى مرسِل CAF، والذي يعتمد على CastContext سينغلتون.

إنّ حزمة تطوير البرامج (SDK) الخاصة بإرسال CAF Sender تستخدم CastContext لإدارة GoogleAPIClient نيابةً عنك. يدير CastContext مراحل النشاط والأخطاء وعمليات معاودة الاتصال نيابةً عنك، مما يجعله تبسيط تطوير تطبيق البث.

مقدمة

  • لا يزال تطبيق CAF Sender موزَّعًا كجزء من "خدمات Google Play" باستخدام مدير حزمة تطوير البرامج (SDK) لنظام التشغيل Android
  • تمت إضافة حِزم جديدة تتحمّل مسؤولية الالتزام قائمة التحقّق الخاصة بتصميم Google Cast (com.google.android.gms.cast.framework.*)
  • يوفّر تطبيق CAF Sender التطبيقات المصغّرة التي تتوافق مع متطلبات تجربة المستخدم لجهاز Cast؛ لم يوفر الإصدار 2 أي مكونات لواجهة المستخدم وطلب منك تنفيذها التطبيقات المصغّرة.
  • لم يعُد استخدام GoogleApiClient مطلوبًا لاستخدام Cast API.
  • تشبه الترجمة والشرح في CAF Sender الإصدار 2.

التبعيات

يعتمد الإصداران 2 وCAF على مكتبات الدعم نفسها وGoogle Play (9.2.0 أو أحدث) كما هو موضح في ميزات مكتبة الدعم الدليل

الحد الأدنى لإصدار حزمة تطوير البرامج (SDK) لنظام التشغيل Android الذي يتوافق مع CAF هو 9 (Gingerbread).

الإعداد

في CAF، يجب تنفيذ خطوة إعداد واضحة لإطار عمل Cast. هذا النمط تتضمن تهيئة CastContext سينغلتون، باستخدام طريقة OptionsProvider لتحديد معرّف تطبيق WebReceiver وأي خيارات عمومية أخرى.

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

لم تكن هذه الخطوات ضرورية في الإصدار 2.

رصد الأجهزة

في CAF، تبدأ عملية الاكتشاف وتتوقف تلقائيًا عن طريق إطار العمل عندما يظهر التطبيق في المقدّمة وينتقل إلى الخلفية على التوالي. MediaRouteSelector وMediaRouter.Callback يجب ألا يكونا استخدام البيانات المختلفة.

زر البث ومربّع حوار البث

وكما في الإصدار 2، يتم توفير هذه المكونات بواسطة مركز دعم MediaRouter المكتبة.

لا يزال زر البث مفعَّلًا من خلال MediaRouteButton ويمكن إضافته إلى نشاطك (باستخدام ActionBar أو a 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() لكل نشاط من خلال استخدام CastButtonFactory لتوصيل MediaRouteButton بإطار عمل Google 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، يتعامل إطار العمل إلى حد كبير مع التحكُّم في الأجهزة. المُرسِل فلا يحتاج التطبيق إلى معالجة (ويجب ألا يحاول التعامل) مع الجهاز وتشغيل تطبيق WebRecipient باستخدام GoogleApiClient يتم الآن تمثيل التفاعل بين المرسل ومستلم الويب على أنه "جلسة". تشير رسالة الأشكال البيانية SessionManager يعالج الصف دورة حياة الجلسة ويبدأ الجلسات ويوقفها تلقائيًا استجابة لإيماءات المستخدم: تبدأ جلسة عندما يختار المستخدم بثًا الجهاز في مربّع حوار البث وينتهي عندما ينقر المستخدم على "إيقاف البث" زر في مربع الحوار "إرسال" أو عند إغلاق تطبيق المُرسِل نفسه. المُرسِل تطبيقك بأحداث مراحل الجلسة من خلال تسجيل SessionManagerListener مع SessionManager. تحدد استدعاءات SessionManagerListener طُرق معاودة الاتصال لجميع أحداث مراحل نشاط الجلسة.

تشير رسالة الأشكال البيانية CastSession تمثل الفئة جلسة مع جهاز بث. وتضم الفئة طرق التحكّم في مستوى صوت الجهاز وحالات كتم الصوت، وهو ما تم تنفيذه سابقًا في الإصدار 2 باستخدام الطرق على Cast.CastApi.

في الإصدار 2، Cast.Listener توفر عمليات الاستدعاء إشعارات بالتغييرات التي تطرأ على حالة الجهاز، بما في ذلك مستوى الصوت وحالة كتم الصوت وحالة الاستعداد وما إلى ذلك

في CAF، يستمر إرسال إشعارات تغيير مستوى الصوت/كتم الصوت من خلال معاودة الاتصال. في Cast.Listener؛ تم تسجيل هؤلاء المستمعين في CastSession ويتم إرسال جميع الإشعارات المتبقية لحالة الجهاز عبر CastStateListener عمليات الاستدعاء؛ هؤلاء المستمعين مسجّلون لدى CastSession. تأكد من مواصلة إلغاء تسجيل المستمعين عند إزالة الأجزاء أو الأنشطة أو التطبيقات المرتبطة إلى الخلفية.

منطق إعادة الربط

وكما هو الحال مع الإصدار 2، يحاول CAF إعادة إنشاء اتصالات الشبكة التي فقدان الاتصال بسبب فقدان إشارة واي فاي مؤقتًا أو أخطاء أخرى في الشبكة. هذا الآن على مستوى الجلسة يمكن أن تدخل الجلسة "معلقة" الحالة عندما ينقطع اتصال الإنترنت، وسينتقل مرة أخرى إلى الحالة "متصل" الحالة عند تتم استعادة الاتصال. ويعتني إطار العمل بإعادة الاتصال تطبيق الويب لجهاز الاستقبال وإعادة ربط أي قنوات بث كجزء من هذه العملية.

بالإضافة إلى ذلك، يضيف CAF أيضًا الاستئناف التلقائي للجلسة والذي يتم تفعيله من خلال افتراضيًا (ويمكن إيقاف تشغيله من خلال CastOptions إذا تم إرسال تطبيق المرسل إلى الخلفية أو تم إنهاؤه (عن طريق التمرير سريعًا للخارج أو بسبب حادث سير) أثناء جلسة البث، استئناف تلك الجلسة عندما يطلب تطبيق المرسل يعود إلى المقدّمة أو تتم إعادة تشغيله يتم التعامل مع هذا الأمر تلقائيًا من خلال SessionManager، التي ستُصدر عمليات معاودة الاتصال المناسبة على أي موقع SessionManagerListener مثال

تسجيل القناة المخصّصة

في الإصدار الثاني، القنوات المخصّصة (يتم تنفيذها باستخدام Cast.MessageReceivedCallback) أن تكون مسجَّلة في Cast.CastApi. في CAF، يتم تسجيل القنوات المخصّصة بدلاً من ذلك بواسطة مثال واحد (CastSession) يمكن إجراء التسجيل في SessionManagerListener.onSessionStarted . بالنسبة إلى تطبيقات الوسائط، لم يعد من الضروري تسجيل قناة التحكم في الوسائط عبر Cast.CastApi.setMessageReceivedCallbacks راجِع القسم التالي للاطّلاع على مزيد من التفاصيل.

التحكم في الوسائط

فئة الإصدار 2 RemoteMediaPlayer تم إيقافها ويجب عدم استخدامها. وفي CAF، حل محله النموذج الجديد RemoteMediaClient التي توفر وظائف مماثلة في واجهة برمجة تطبيقات أكثر ملاءمة. من المهم غير ضروري لإعداد هذا الكائن أو تسجيله بشكل صريح إطار العمل سيتم إنشاء مثيل الكائن تلقائيًا وتسجيل الوسائط الأساسية القناة في وقت بدء الجلسة في حالة اتصال تطبيق WebRecipients يتيح استخدام مساحة اسم الوسائط.

يمكن الوصول إلى RemoteMediaClient على أنّه الطريقة getRemoteMediaClient للكائن CastSession.

في الإصدار الثاني، ستعرض كل طلبات الوسائط الصادرة في RemoteMediaPlayer RemoteMediaPlayer.MediaChannelResult عن طريق معاودة الاتصال عبر PendingResult.

في CAF، تعرض كل طلبات الوسائط الصادرة في RemoteMediaClient RemoteMediaClient.MediaChannelResult من خلال PendingResult يمكن استخدامها لتتبع التقدم والنتيجة النهائية طلبك.

سيرسِل الإصدار 2 من "RemoteMediaPlayer" إشعارات بشأن التغييرات في الوسائط. على جهاز استقبال الويب عبر RemoteMediaPlayer.OnStatusUpdatedListener

في CAF، يوفر RemoteMediaClient استدعاءات مكافئة من خلال RemoteMediaClient.Listener من واجهة pyplot. يمكن تسجيل أي عدد من المستمعين في RemoteMediaClient، والذي يسمح لمكونات مرسلة متعددة بمشاركة مثال واحد من RemoteMediaClient مرتبط بالجلسة.

في الإصدار 2، كان على تطبيق المرسل أن يتحمل عبء الحفاظ على المستخدم متزامنة مع حالة مشغّل الوسائط على جهاز استقبال الويب.

في CAF، الفئة UIMediaController وتحمل معظم هذه المسئولية.

تراكب تمهيدي

لا يوفر الإصدار 2 واجهة مستخدم تمهيدية تظهر على سطح الفيديو.

يوفّر CAF طريقة عرض مخصّصة IntroductoryOverlay لتمييز زر البث عند عرضه للمستخدمين لأول مرة.

وحدة تحكُّم صغيرة

وفي الإصدار 2، تحتاج إلى تنفيذ وحدة تحكُّم صغيرة من البداية في تطبيق المُرسِل.

في CAF، توفر SDK عرضًا مخصصًا، MiniControllerFragment، والذي يمكنك إضافته إلى ملف تخطيط التطبيق للأنشطة التي فأنت تريد أن تُظهر وحدة التحكم المصغَّرة.

الإشعار وشاشة القفل

أما في الإصدار الثاني، فلا توفّر حزمة تطوير البرامج (SDK) وحدات تحكّم للإشعارات وشاشة القفل. وبالنسبة إلى حزمة تطوير البرامج (SDK) هذه، يجب إنشاء هذه الميزات في تطبيق المُرسِل باستخدام واجهات برمجة التطبيقات لإطار عمل Android

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

تم توسيع وحدة التحكُّم

في الإصدار 2، يجب تنفيذ وحدة تحكّم موسّعة من البداية تطبيق المرسل.

يوفر CAF UIMediaController التي تسهّل عليك إنشاء تصنيفك الخاص المستخدم.

CAF يضيف تطبيق مصغّر تم إنشاؤه مسبقًا لوحدة التحكم ExpandedControllerActivity التي يمكنك إضافتها ببساطة إلى تطبيقك لم تعد بحاجة إلى تنفيذ وحدة تحكُّم موسّعة مخصّصة باستخدام UIMediaController.

التركيز على الصوت

وفي الإصدار 2، عليك استخدام MediaSessionCompat لإدارة التركيز الصوتي.

في CAF، تتم إدارة التركيز الصوتي تلقائيًا.

تسجيل تصحيح الأخطاء

في CAF، ما مِن خيارات للتسجيل.

نماذج التطبيقات

لدينا برامج تعليمية عن الترميز أو نماذج تطبيقات التي تستخدم CAF.