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

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

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

مقدمة

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

الاعتمادية

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

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

الإعداد

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

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 لكل نشاط:

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.

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

كما هو الحال في الإصدار الثاني، يتم توفير هذه المكوّنات من خلال مكتبة دعم 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 بإطار عمل 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، تتم معالجة التحكّم في الجهاز إلى حد كبير من خلال إطار العمل. لا يحتاج تطبيق المُرسِل إلى معالجة (ولا يجب أن يحاول معالجة) الاتصال بالجهاز وتشغيل تطبيق &quot;جهاز الاستقبال على الويب&quot; باستخدام GoogleApiClient. يتم الآن تمثيل التفاعل بين المُرسِل وجهاز استقبال الويب كـ "جلسة". تتعامل الفئة SessionManager مع مراحل نشاط الجلسة وتبدأ الجلسات وتوقفها تلقائيًا استجابةً لإجراءات تفاعلية من المستخدم: تبدأ الجلسة عندما يختار المستخدم جهاز Cast في مربّع حوار Cast وتنتهي عندما ينقر المستخدم على الزر "إيقاف البث" في مربّع حوار Cast أو عند إنهاء تطبيق المُرسِل نفسه. يمكن إرسال إشعارات إلى تطبيق المُرسِل بشأن أحداث يتم في مراحل نشاط الجلسة من خلال تسجيل SessionManagerListener باستخدام SessionManager. تحدّد عمليات رد الاتصال في SessionManagerListener طرق رد الاتصال لجميع الأحداث التي تتم في مراحل الجلسة.

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

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

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

آلية إعادة الاتصال

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

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

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

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

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

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

يمكن الوصول إلى RemoteMediaClient كإجراء getRemoteMediaClient لعنصر CastSession.

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

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

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

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

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

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

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

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