نقل تطبيق مُرسِل نظام التشغيل Android من الإصدار 2 من حزمة تطوير البرامج (SDK) إلى Google Cast إلى إطار عمل تطبيق Cast (CAF)

تنظيم صفحاتك في مجموعات يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.

يتيح لك الإجراء التالي تحويل تطبيق المُرسِل الذي يعمل بنظام التشغيل Android من Cast SDK v2 إلى إرسال CAF، استنادًا إلى CastContext singleton.

تستخدم حزمة تطوير البرامج (SDK) لمُرسِل CAF في Cast CastCast لإدارة GoogleAPIClient نيابةً عنك. يُدير CastContext دورات الحياة والأخطاء ومعاودة الاتصال، ما يسهِّل إلى حد كبير تطوير تطبيق Cast.

المقدمة

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

العناصر التابعة

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

الحد الأدنى لإصدار Android SDK الذي يدعمه CAF هو 9 (Gingerbread).

الإعداد

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

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

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

منطق إعادة الاتصال

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

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

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

في الإصدار 2، يتم تسجيل القنوات المخصّصة (التي يتم تنفيذها باستخدام 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 معظم هذه المسؤولية.

تراكب تمهيدي

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

يوفّر 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.