Android Sender App vom Cast SDK v2 zum Cast Application Framework (CAF) migrieren

Mit den folgenden Schritten kannst du deine Android-Sender-App von Cast konvertieren SDK v2 an CAF-Sender, der auf dem CastContext Singleton.

Das Cast CAF Sender SDK verwendet CastContext zur Verwaltung des GoogleAPIClient in deinem Namen. CastContext verwaltet Lebenszyklen, Fehler und Rückrufe für Sie, was sehr vereinfacht die Entwicklung einer Cast-App.

Einführung

  • Der CAF-Sender wird weiterhin über die Google Play-Dienste bereitgestellt mit dem Android SDK Manager
  • Es wurden neue Pakete hinzugefügt, die die Einhaltung der Checkliste für das Google Cast-Design (com.google.android.gms.cast.framework.*)
  • Der CAF-Sender stellt Widgets bereit, die den Cast UX-Anforderungen entsprechen. In Version 2 wurden keine UI-Komponenten bereitgestellt, sodass Sie diese implementieren mussten. Widgets.
  • Für die Nutzung der Cast API ist die Verwendung von GoogleApiClient nicht mehr erforderlich.
  • Die Untertitelung in CAF Sender ähnelt v2.

Abhängigkeiten

V2 und CAF haben dieselben Abhängigkeiten von den Supportbibliotheken und Google Play -Dienste (9.2.0 oder höher), wie unter Funktionen der Supportbibliothek beschrieben Leitfaden

CAF muss mindestens die Android SDK-Version 9 (Gingerbread) unterstützen.

Initialisierung

In CAF ist ein expliziter Initialisierungsschritt für das Cast-Framework erforderlich. Dieses beinhaltet die Initialisierung der CastContext Singleton mit einem geeigneten OptionsProvider zum Angeben der Web Receiver-Anwendungs-ID und anderer globaler Optionen.

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;
    }
}

Deklarieren Sie OptionsProvider innerhalb der Anwendung Tag der App AndroidManifest.xml-Datei:

<application>
...
    <meta-data
        android:name=
            "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
        android:value="com.google.sample.cast.refplayer.CastOptionsProvider" />
</application>

Initialisieren Sie CastContext verzögert in der onCreate-Methode jeder Aktivität:

private CastContext mCastContext;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.video_browser);
    setupActionBar();

    mCastContext = CastContext.getSharedInstance(this);
}

Diese Schritte waren in Version 2 nicht erforderlich.

Geräteerkennung

In CAF wird der Erkennungsprozess automatisch vom wenn die App in den Vordergrund wechselt und in den Hintergrund wechselt, . MediaRouteSelector und MediaRouter.Callback dürfen nicht verwendet.

Cast-Symbol und Streaming-Dialogfeld

Wie in Version 2 werden diese Komponenten vom MediaRouter-Support Bibliothek.

Das Cast-Symbol wird weiterhin vom MediaRouteButton und können Ihrer Aktivität hinzugefügt werden (entweder ActionBar oder Toolbar), als Menüpunkt in Ihrem Menü.

<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()-Methode für jede Aktivität überschreiben, indem CastButtonFactory um MediaRouteButton mit dem Cast-Framework zu verbinden:

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;
}

Wenn jemand auf die Schaltfläche tippt, wird automatisch das Cast-Dialogfeld angezeigt.

Gerätesteuerung

In CAF wird die Gerätesteuerung weitgehend vom Framework übernommen. Absender Anwendung nicht verarbeiten muss (und sollte auch nicht versuchen), die Verbindung zu und starten Sie die Web Receiver-App mithilfe der GoogleApiClient Interaktion zwischen Sender und Webempfänger wird jetzt dargestellt als „Sitzung“. Die SessionManager wickelt den Sitzungslebenszyklus ab und startet und beendet Sitzungen automatisch als Reaktion auf Nutzergesten: Eine Sitzung wird gestartet, wenn der Nutzer ein Cast-Symbol auswählt. Gerät im Cast-Dialogfeld angezeigt und wird beendet, wenn der Nutzer auf die Schaltfläche „Streaming beenden“ tippt im Cast-Dialogfeld oder wenn die Sender-App selbst beendet wird. Absender Anwendung über Sitzungslebenszyklus-Ereignisse informiert werden, indem eine SessionManagerListener mit SessionManager. Die SessionManagerListener-Callbacks definieren Callback-Methoden für alle Lebenszyklusereignisse einer Sitzung.

Die CastSession -Klasse steht für eine Sitzung mit einem Übertragungsgerät. Die Klasse verfügt über Methoden für zum Steuern der Gerätelautstärke und zum Stummschalten, was bisher in Version 2 der mit Methoden auf Cast.CastApi.

In Version 2 enthält der Parameter Cast.Listener Callbacks für Benachrichtigungen über Änderungen des Gerätestatus, einschließlich Lautstärke, Stummschaltung, Stand-by-Status usw.

In CAF werden Benachrichtigungen über Statusänderungen der Lautstärke/Stummschaltung weiterhin per Rückruf zugestellt. Methoden in Cast.Listener; Diese Listener sind registriert mit CastSession Alle verbleibenden Gerätestatusbenachrichtigungen werden über CastStateListener Callbacks Diese Listener sind in der CastSession registriert. Achten Sie darauf, die Registrierung von Listenern immer noch aufzuheben, wenn die zugehörigen Fragmente, Aktivitäten oder Apps in den Hintergrund.

Logik für die erneute Verbindung

Wie bei v2 versucht CAF, Netzwerkverbindungen wiederherzustellen, aufgrund eines vorübergehenden WLAN-Signals oder anderer Netzwerkfehler verloren gehen. Das ist jetzt auf Sitzungsebene durchgeführt, kann eine Sitzung in eine "gesperrte" wenn der Parameter wird die Verbindung unterbrochen und sie wechselt wieder zu „verbunden“. Zustand, wenn Verbindung wurde wiederhergestellt. Das Framework stellt die Verbindung zum Web Receiver App und stellen dabei die Verbindung aller Übertragungskanäle wieder her.

Außerdem fügt CAF die automatische Wiederaufnahme von Sitzungen hinzu, Standardeinstellung (kann deaktiviert werden über CastOptions Wenn die Absenderanwendung in den Hintergrund verschoben oder beendet wird (durch oder aufgrund eines Absturzes wegwischen, wird das Signal wird das Framework versuchen, diese Sitzung fortzusetzen, wenn die Absenderanwendung kehrt in den Vordergrund zurück oder wird neu gestartet; wird dies automatisch vom SessionManager, das die entsprechenden Callbacks für alle registrierten SessionManagerListener Instanzen.

Registrierung eines benutzerdefinierten Channels

In Version 2 wurden benutzerdefinierte Channels (die mithilfe von Cast.MessageReceivedCallback) sind in der Cast.CastApi registriert. In CAF werden benutzerdefinierte Channels stattdessen mit dem CastSession-Instanz. Die Registrierung kann in der SessionManagerListener.onSessionStarted . Für Medienanwendungen ist es nicht mehr erforderlich, den Mediensteuerungskanal über Cast.CastApi.setMessageReceivedCallbacks registrieren; finden Sie im folgenden Abschnitt weitere Informationen.

Mediensteuerung

Die v2-Klasse RemoteMediaPlayer ist veraltet und sollte nicht mehr verwendet werden. In CAF wird es durch das neue RemoteMediaClient -Klasse, die gleichwertige Funktionen in einer praktischeren API bietet. Es ist Es ist nicht erforderlich, dieses Objekt explizit zu initialisieren oder zu registrieren. Framework wird automatisch das Objekt instanziiert und das zugrunde liegende Medium registriert. Kanal zu Beginn der Sitzung, wenn die Web Receiver-Anwendung mit unterstützt den Medien-Namespace.

Auf RemoteMediaClient kann zugegriffen werden als Methode getRemoteMediaClient des Objekts CastSession.

In Version 2 würden alle an den RemoteMediaPlayer gesendeten Medienanfragen den Fehler RemoteMediaPlayer.MediaChannelResult über einen PendingResult-Callback.

In CAF geben alle am RemoteMediaClient gesendeten Medienanfragen einen Fehler zurück: RemoteMediaClient.MediaChannelResult über ein PendingResult Callback, mit dem der Fortschritt und das Endergebnis der

RemoteMediaPlayer (v2) hat Benachrichtigungen zu Änderungen in den Medien gesendet Player-Status beim Web Receiver über die RemoteMediaPlayer.OnStatusUpdatedListener.

In CAF stellt RemoteMediaClient äquivalente Callbacks über seine RemoteMediaClient.Listener . Eine beliebige Anzahl von Listenern kann mit dem RemoteMediaClient, wodurch mehrere Absenderkomponenten die Möglichkeit haben, einzelne Instanz von RemoteMediaClient, die der Sitzung zugeordnet ist.

In Version 2 musste die Senderanwendung die Last übernehmen, den Nutzer mit dem Mediaplayer-Status auf dem Web Receiver synchronisiert.

In CAF hat der Kurs UIMediaController übernimmt einen Großteil dieser Verantwortung.

Einleitendes Overlay

Version 2 bietet keine einführende Overlay-Benutzeroberfläche.

CAF bietet eine benutzerdefinierte Ansicht IntroductoryOverlay um das Cast-Symbol hervorzuheben, wenn es Nutzern zum ersten Mal angezeigt wird.

Mini-Controller

In Version 2 müssen Sie einen neuen Mini-Controller in der Sender-App implementieren.

In CAF bietet das SDK eine benutzerdefinierte Ansicht, MiniControllerFragment, die Sie der App-Layoutdatei der Aktivitäten hinzufügen können, den Mini-Controller zeigen.

Benachrichtigungen und Sperrbildschirm

In Version 2 werden vom SDK keine Controller für Benachrichtigungen und Sperrbildschirm bereitgestellt. Für dieses SDK müssen Sie diese Funktionen mithilfe der Android-Framework-APIs

In CAF stellt das SDK ein NotificationsOptions.Builder zum Erstellen von Mediensteuerelementen für Benachrichtigungen und Sperrbildschirm in die Absender-App ein. Benachrichtigungs- und Sperrbildschirmeinstellungen können aktiviert werden mit dem CastOptions beim Initialisieren von 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();
}

Maximierter Controller

In Version 2 müssen Sie einen erweiterten Controller in die Absender-App.

CAF bietet eine UIMediaController Hilfsklasse, mit der Sie ganz einfach Ihre eigene erweiterte Controller.

CAF bietet ein vorgefertigtes erweitertes Controller-Widget ExpandedControllerActivity die Sie einfach Ihrer App hinzufügen können. Sie müssen nicht mehr Implementieren Sie mithilfe von UIMediaController einen benutzerdefinierten erweiterten Controller.

Audiofokus

In Version 2 müssen Sie MediaSessionCompat verwenden, um den Audiofokus zu verwalten.

In CAF wird der Audiofokus automatisch verwaltet.

Fehlerprotokollierung

In CAF gibt es keine Logging-Optionen.

Beispielapps

Wir haben Codelab-Anleitungen und Beispiel-Apps die CAF verwenden.