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

يتيح لك الإجراء التالي تحويل تطبيق المُرسِل الذي يعمل بنظام التشغيل Android من الإصدار الثاني من حزمة تطوير البرامج (SDK) لإرسال إلى مُرسِل CAF، استنادًا إلى CastContext tonton.

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

المقدمة

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

المهام التابعة

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

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

الإعداد

في CAF، يجب إعداد خطوة إعداد صريحة لإطار عمل البث. ويتضمّن ذلك إعداد 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، يتم توفير هذه المكوّنات من خلال مكتبة دعم Mediarr.

يستمر تطبيق زر البث من خلال 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 إعادة إنشاء اتصالات الشبكة المفقودة بسبب فقدان إشارة شبكة Wi-Fi المؤقتة أو أخطاء أخرى في الشبكة. يتم ذلك الآن على مستوى الجلسة، ويمكن أن تدخل الجلسة حالة "مُعلَّق" عند فقدان الاتصال، ستنتقل إلى الحالة "متصل" عند استعادة الاتصال. يتولّى إطار العمل إعادة الاتصال بتطبيق "مستلِم الويب" وإعادة ربط أي قنوات بث كجزء من هذه العملية.

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

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

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

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

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

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

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

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

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

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

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

في 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.

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

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

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

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

في CAF لا تتوفّر خيارات تسجيل.

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

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