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

يتيح لك الإجراء التالي تحويل تطبيق المُرسِل على Android من الإصدار 2 من Cast SDK إلى تطبيق CAF Sender، وذلك استنادًا إلى تطبيق CastContext Singleton.

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

مقدمة

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

التبعيات

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

الحد الأدنى لإصدار حزمة تطوير البرامج (SDK) لنظام التشغيل Android الذي يتوافق مع CAF هو 9 (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 ضمن علامة "التطبيق" في ملف 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 أو 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 بإطار عمل البثّ:

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 جلسة باستخدام جهاز بث. تتضمّن الفئة طُرقًا للتحكّم في مستوى صوت الجهاز وحالات كتم الصوت، وهو إجراء كان يتم تنفيذه سابقًا في الإصدار 2 باستخدام طرق على Cast.CastApi.

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

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

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

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

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

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

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

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

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

يمكن الوصول إلى RemoteMediaClient بالطريقة getRemoteMediaClient للكائن CastSession.

في الإصدار 2، تعرض جميع طلبات الوسائط الصادرة في RemoteMediaPlayer رسالة RemoteMediaPlayer.MediaChannelResult من خلال معاودة الاتصال بـ PendingResult.

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

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

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

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

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

إعلان على سطح الفيديو التمهيدي

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

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

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

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

في CAF، توفِّر حزمة تطوير البرامج (SDK) عرضًا مخصّصًا MiniControllerFragment يمكنك إضافته إلى ملف تنسيق التطبيقات الخاص بالأنشطة التي تريد عرض وحدة التحكّم المصغَّرة فيها.

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

أما في الإصدار 2، فلا توفر حزمة 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.