העברה של אפליקציית Android Sender מ-Cast SDK v2 ל-Cast Application Framework (CAF)

התהליך הבא מאפשר לכם להמיר את אפליקציית השליחה ל-Android מ-Cast SDK v2 ל-CAF Sender, שמבוסס על ה-singleton‏ CastContext.

ה-SDK של Cast CAF Sender משתמש ב-CastContext כדי לנהל את GoogleAPIClient בשמכם. ‏CastContext מנהל את מחזורי החיים, השגיאות והקריאות החוזרות (callbacks) בשבילכם, וכך מפשט מאוד את הפיתוח של אפליקציית Cast.

מבוא

  • CAF Sender עדיין מופץ כחלק מ-Google Play Services באמצעות מנהל Android SDK
  • נוספו חבילות חדשות שמקבלות אחריות על תאימות לרשימת המשימות של Google בנושא עיצוב העברה (Cast) (com.google.android.gms.cast.framework.*)
  • CAF Sender מספק ווידג'טים שתואמים לדרישות של חוויית המשתמש של Cast. בגרסה 2 לא היו רכיבי ממשק משתמש, והייתם צריכים להטמיע את הווידג'טים האלה.
  • כבר לא צריך להשתמש ב-GoogleApiClient כדי להשתמש ב-Cast API.
  • הכתוביות ב-CAF Sender דומות לאלו ב-V2.

יחסי תלות

ל-V2 ול-CAF יש את אותן יחסי תלות בספריות התמיכה ובשירותי Google Play‏ (9.2.0 ואילך), כפי שמתואר במדריך למאפיינים של ספריות התמיכה.

גרסת Android SDK המינימלית שנתמכת על ידי CAF היא 9 (Gingerbread).

אתחול

ב-CAF, נדרש שלב אתחול מפורש למסגרת Cast. לשם כך, צריך לאתחל את המשתנה היחיד (singleton) CastContext באמצעות 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.

הלחצן להפעלת Cast ותיבת הדו-שיח של Cast

בדומה לגרסה 2, הרכיבים האלה מסופקים על ידי ספריית התמיכה של MediaRouter.

לחצן ההעברה (cast) עדיין מוטמע ב-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() של כל Activity באמצעות 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, המערכת מטפלת ברוב הנושאים הקשורים לשליטה במכשיר. אפליקציית השולח לא צריכה לטפל (ואסור להשתדל לטפל) בחיבור למכשיר ובהפעלת אפליקציית Web Receiver באמצעות GoogleApiClient. האינטראקציה בין השולח לבין Web Receiver מיוצגת עכשיו בתור 'סשן'. הכיתה SessionManager מטפלת במחזור החיים של הסשן ומפעילה ומפסיקה סשנים באופן אוטומטי בתגובה לתנועות של המשתמש: סשן מתחיל כשהמשתמש בוחר מכשיר העברה בתיבת הדו-שיח של העברה, ומסתיים כשהמשתמש מקייש על הלחצן 'הפסקת ההעברה' בתיבת הדו-שיח של העברה או כשאפליקציית השולח מסתיימת. כדי לקבל התראות על אירועים במחזור החיים של הסשן, אפליקציית השולח יכולה לרשום SessionManagerListener ב-SessionManager. פונקציות ה-callbacks של SessionManagerListener מגדירות שיטות callback לכל אירועי מחזור החיים של הסשן.

הכיתה CastSession מייצגת סשן עם מכשיר Cast. בכיתה יש שיטות לשלוט בעוצמת הקול ובמצב ההשתקה של המכשיר. בעבר, ב-v2, השליטה בוצעה באמצעות שיטות ב-Cast.CastApi.

בגרסה 2, קריאות החזרה (callbacks) של Cast.Listener סיפקו התראות על שינויים בסטטוס המכשיר, כולל עוצמת הקול, מצב ההשתקה, מצב המתנה וכו'.

ב-CAF, עדיין מתקבלות התראות על שינויים במצב עוצמת הקול או ההשתקה באמצעות שיטות קריאה חוזרת ב-Cast.Listener. המאזינים האלה רשומים ב-CastSession. כל שאר ההתראות לגבי מצב המכשיר מועברות באמצעות קריאות חזרה מסוג CastStateListener. אלה מאזינים שמתועדים ב-CastSession. חשוב לוודא שעדיין מבטלים את הרישום של המאזינים כשהקטעים, הפעילויות או האפליקציות המשויכים עוברים לרקע.

לוגיקה של חיבור מחדש

בדומה לגרסה 2, CAF מנסה ליצור מחדש חיבורי רשת שאבדו בגלל אובדן זמני של אות ה-Wi-Fi או שגיאות רשת אחרות. הפעולה הזו מתבצעת עכשיו ברמת הסשן. סשן יכול לעבור למצב 'מושעה' כשהחיבור מנותק, והוא יחזור למצב 'מחובר' כשהקישוריות תחודש. כחלק מהתהליך, המסגרת דואגת לחבר מחדש לאפליקציית Web Receiver ולחבר מחדש את ערוצי ה-Cast.

בנוסף, CAF מוסיף גם המשך אוטומטי של סשנים, שמופעל כברירת מחדל (וניתן להשבית אותו באמצעות CastOptions). אם אפליקציית השולח מועברת לרקע או מסתיימת (על ידי החלקה או בגלל קריסה) בזמן סשן העברה, המסגרת תנסה להמשיך את הסשן כשאפליקציית השולח תחזור לחזית או שתופעל מחדש. הטיפול בכך מתבצע באופן אוטומטי על ידי SessionManager, שינפיק את קריאות החזרה המתאימות לכל המופעים הרשומים של SessionManagerListener.

רישום ערוץ מותאם אישית

בגרסה 2, ערוצים מותאמים אישית (שמוטמעים באמצעות Cast.MessageReceivedCallback) רשומים באמצעות Cast.CastApi. ב-CAF, ערוצים מותאמים אישית רשומים במקום זאת במכונה CastSession. אפשר לבצע את הרישום בשיטת הקריאה החוזרת SessionManagerListener.onSessionStarted. באפליקציות מדיה, כבר אין צורך לרשום באופן מפורש את ערוץ הבקרה של המדיה באמצעות Cast.CastApi.setMessageReceivedCallbacks. פרטים נוספים מופיעים בקטע הבא.

פקד מדיה

הכיתה v2‏ RemoteMediaPlayer הוצאה משימוש ואין להשתמש בה. ב-CAF, הוא הוחלף על ידי הכיתה החדשה RemoteMediaClient, שמספקת פונקציונליות זהה בממשק API נוח יותר. אין צורך לאתחל או לרשום את האובייקט הזה באופן מפורש. המסגרת תיצור את האובייקט באופן אוטומטי ותרשום את ערוץ המדיה הבסיסי בזמן תחילת הסשן, אם אפליקציית Web Receiver שמחוברת תומכת במרחב השמות של המדיה.

אפשר לגשת ל-RemoteMediaClient בתור השיטה getRemoteMediaClient של האובייקט CastSession.

בגרסה 2, כל בקשות המדיה שהונחו על RemoteMediaPlayer יחזירו RemoteMediaPlayer.MediaChannelResult באמצעות קריאה חוזרת (callback) של PendingResult.

ב-CAF, כל בקשות המדיה שהונחו על RemoteMediaClient מחזירות RemoteMediaClient.MediaChannelResult באמצעות קריאה חוזרת (callback) של PendingResult, שאפשר להשתמש בה כדי לעקוב אחרי ההתקדמות והתוצאה הסופית של הבקשה.

RemoteMediaPlayer בגרסה 2 ישלח התראות על שינויים במצב של נגן המדיה במקלט האינטרנט דרך RemoteMediaPlayer.OnStatusUpdatedListener.

ב-CAF, ה-RemoteMediaClient מספק קריאות חזרה מקבילות דרך הממשק שלו, RemoteMediaClient.Listener. אפשר לרשום מספר בלתי מוגבל של מאזינים ב-RemoteMediaClient, וכך לאפשר למספר רכיבי שולחים לשתף את המופע היחיד של RemoteMediaClient שמשויך לסשן.

בגרסה 2, אפליקציית השולח נאלצה לשאת בנטל של שמירה על סנכרון בין ממשק המשתמש לבין מצב נגן המדיה במקלט האינטרנט.

ב-CAF, הכיתה UIMediaController אחראית על רוב האחריות הזו.

שכבת-על של מבצע היכרות

בגרסה 2 אין ממשק משתמש שכבת-על מבוא.

CAF מספק תצוגה מותאמת אישית IntroductoryOverlay כדי להדגיש את לחצן ההעברה (cast) כשהוא מוצג למשתמשים בפעם הראשונה.

בקר מיני

בגרסה 2, צריך להטמיע בקר מיני מאפס באפליקציית השולח.

ב-CAF, ה-SDK מספק תצוגה מותאמת אישית, MiniControllerFragment, שאפשר להוסיף לקובץ הפריסה של האפליקציה של הפעילויות שבהן רוצים להציג את השליטה המינימלית.

התראות ומסך נעילה

בגרסה 2, ה-SDK לא מספק בקרי התראות ומסך נעילה. כדי להשתמש ב-SDK הזה, צריך להטמיע את התכונות האלה באפליקציית השולח באמצעות ממשקי ה-API של מסגרת 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 אין אפשרויות רישום ביומן.

אפליקציות לדוגמה

יש לנו מדריכים ב-codelab ואפליקציות לדוגמה שמשתמשות ב-CAF.