Migracja aplikacji nadawcy na Androida z pakietu SDK Cast w wersji 2 do platformy Cast Application Framework (CAF)

Poniższa procedura umożliwia przekonwertowanie aplikacji nadawczej na Androida z pakietu Cast SDK w wersji 2 na CAF Sender, który jest oparty na wzorcu singleton CastContext.

Pakiet SDK Cast CAF Sender używa CastContext do zarządzania GoogleAPIClient w Twoim imieniu. CastContext zarządza cyklami życia, błędami i wywołaniami zwrotnymi, co znacznie upraszcza tworzenie aplikacji Cast.

Wprowadzenie

  • Pakiet CAF Sender jest nadal rozpowszechniany w ramach usług Google Play za pomocą menedżera Android SDK.
  • Dodano nowe pakiety, które odpowiadają za zgodność z listą kontrolną projektowania Google Cast (com.google.android.gms.cast.framework.*).
  • CAF Sender udostępnia widżety zgodne z wymaganiami Cast UX. Wersja 2 nie udostępniała żadnych komponentów interfejsu i wymagała zaimplementowania tych widżetów.
  • Korzystanie z interfejsu Cast API nie wymaga już używania GoogleApiClient.
  • Napisy w nadajniku CAF są podobne do wersji 2.

Zależności

Wersja 2 i CAF mają te same zależności od bibliotek pomocy i usług Google Play (9.2.0 lub nowszych), jak opisano w przewodniku po funkcjach biblioteki pomocy.

Minimalna wersja pakietu Android SDK obsługiwana przez CAF to 9 (Gingerbread).

Zdarzenie inicjujące

W CAF wymagany jest wyraźny krok inicjowania platformy Cast. Wymaga to zainicjowania obiektu pojedynczego CastContext przy użyciu odpowiedniego obiektu OptionsProvider, aby określić identyfikator aplikacji odbiornika internetowego i inne opcje globalne.

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

Zadeklaruj OptionsProvider w tagu „application” w pliku AndroidManifest.xml aplikacji:

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

Zainicjuj CastContext w metodzie onCreate każdej aktywności:

private CastContext mCastContext;

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

    mCastContext = CastContext.getSharedInstance(this);
}

W wersji 2 te kroki nie były konieczne.

Wykrywanie urządzeń

W CAF proces wykrywania jest uruchamiany i zatrzymywany automatycznie przez platformę, gdy aplikacja przechodzi odpowiednio na pierwszy plan i w tło. Nie należy używać MediaRouteSelector i MediaRouter.Callback.

Przycisk Cast i okno Cast

Podobnie jak w przypadku wersji 2 te komponenty są dostarczane przez bibliotekę pomocy MediaRouter.

Przycisk Cast jest nadal implementowany przez MediaRouteButton i można go dodać do aktywności (za pomocą ActionBar lub Toolbar) jako element menu.

<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"/>

Zastąp metodę onCreateOptionMenu() każdej aktywności, używając CastButtonFactory, aby połączyć MediaRouteButton z platformą 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;
}

Gdy ktoś kliknie przycisk, automatycznie pojawi się okno Cast.

Sterowanie urządzeniem

W CAF sterowanie urządzeniem jest w dużej mierze obsługiwane przez platformę. Aplikacja nadawcy nie musi obsługiwać (i nie powinna próbować obsługiwać) połączenia z urządzeniem i uruchamiania aplikacji odbiornika internetowego za pomocą GoogleApiClient. Interakcja między nadawcą a odbiornikiem internetowym jest teraz reprezentowana jako „sesja”. Klasa SessionManager obsługuje cykl życia sesji i automatycznie rozpoczyna i kończy sesje w odpowiedzi na gesty użytkownika: sesja rozpoczyna się, gdy użytkownik wybierze urządzenie Cast w oknie Cast, a kończy się, gdy użytkownik kliknie przycisk „Zatrzymaj przesyłanie” w oknie Cast lub gdy aplikacja nadawcy zostanie zamknięta. Aplikacja nadawcy może otrzymywać powiadomienia o zdarzeniach cyklu życia sesji, rejestrując SessionManagerListener w SessionManager. Wywołania zwrotne SessionManagerListener definiują metody wywołania zwrotnego dla wszystkich zdarzeń cyklu życia sesji.

Klasa CastSession reprezentuje sesję z urządzeniem przesyłającym. Klasa zawiera metody sterowania głośnością urządzenia i wyciszania, które w wersji 2 były realizowane za pomocą metod w Cast.CastApi.

W wersji 2 wywołania zwrotne Cast.Listener dostarczały powiadomienia o zmianach stanu urządzenia, w tym głośności, wyciszenia, trybu gotowości itp.

W CAF powiadomienia o zmianie stanu głośności/wyciszenia są nadal dostarczane za pomocą metod wywołania zwrotnego w Cast.Listener. Te detektory są rejestrowane za pomocą CastSession. Wszystkie pozostałe powiadomienia o stanie urządzenia są dostarczane przez wywołania zwrotne CastStateListener. Te detektory są zarejestrowane w CastSession. Pamiętaj, aby wyrejestrować detektory, gdy powiązane fragmenty, aktywności lub aplikacje przejdą w tło.

Logika ponownego połączenia

Podobnie jak w przypadku wersji 2, CAF próbuje ponownie nawiązać połączenia sieciowe, które zostały utracone z powodu tymczasowej utraty sygnału Wi-Fi lub innych błędów sieci. Teraz odbywa się to na poziomie sesji. Sesja może przejść w stan „zawieszona”, gdy połączenie zostanie utracone, i wrócić do stanu „połączona”, gdy połączenie zostanie przywrócone. W ramach tego procesu platforma dba o ponowne połączenie z aplikacją odbiornika internetowego i wszystkimi kanałami przesyłania.

Dodatkowo CAF dodaje automatyczne wznawianie sesji, które jest domyślnie włączone (i można je wyłączyć za pomocą CastOptions. Jeśli aplikacja nadawcy zostanie wysłana do działania w tle lub zostanie zamknięta (przez przesunięcie palcem lub z powodu awarii) podczas trwania sesji Cast, platforma spróbuje wznowić tę sesję, gdy aplikacja nadawcy powróci na pierwszy plan lub zostanie ponownie uruchomiona. Jest to obsługiwane automatycznie przez SessionManager, który wyda odpowiednie wywołania zwrotne w przypadku wszystkich zarejestrowanych instancji SessionManagerListener.

Rejestracja kanału niestandardowego

W wersji 2 kanały niestandardowe (wdrażane za pomocą Cast.MessageReceivedCallback) są rejestrowane w Cast.CastApi. W CAF kanały niestandardowe są rejestrowane w instancji CastSession. Rejestrację można przeprowadzić w metodzie wywołania zwrotnego SessionManagerListener.onSessionStarted. W przypadku aplikacji multimedialnych nie trzeba już jawnie rejestrować kanału sterowania multimediami za pomocą Cast.CastApi.setMessageReceivedCallbacks. Więcej informacji znajdziesz w następnej sekcji.

Sterowanie multimediami

Klasa v2 RemoteMediaPlayer została wycofana i nie należy jej używać. W CAF zastępuje ją nowa klasa RemoteMediaClient, która zapewnia równoważne funkcje w bardziej przystępnym interfejsie API. Nie trzeba jawnie inicjować ani rejestrować tego obiektu. Platforma automatycznie utworzy instancję obiektu i zarejestruje bazowy kanał multimedialny w czasie rozpoczęcia sesji, jeśli aplikacja odbiornika internetowego, z którą nawiązywane jest połączenie, obsługuje przestrzeń nazw multimediów.

Dostęp do RemoteMediaClient można uzyskać za pomocą metody getRemoteMediaClient obiektu CastSession.

W wersji 2 wszystkie żądania multimediów wysyłane do RemoteMediaPlayer zwracają RemoteMediaPlayer.MediaChannelResult za pomocą wywołania zwrotnego PendingResult.

W CAF wszystkie żądania multimediów wysyłane do RemoteMediaClient zwracają RemoteMediaClient.MediaChannelResult za pomocą wywołania zwrotnego PendingResult, którego można użyć do śledzenia postępu i ostatecznego wyniku żądania.

W wersji 2 RemoteMediaPlayer wysyła powiadomienia o zmianach stanu odtwarzacza multimedialnego w aplikacji Web Receiver za pomocą RemoteMediaPlayer.OnStatusUpdatedListener.

W CAF RemoteMediaClient udostępnia równoważne wywołania zwrotne za pomocą interfejsu RemoteMediaClient.Listener. Z obiektem RemoteMediaClient można zarejestrować dowolną liczbę detektorów, co pozwala wielu komponentom nadawcy na współdzielenie pojedynczej instancji obiektu RemoteMediaClient powiązanej z sesją.

W wersji 2 aplikacja nadawcy musiała dbać o synchronizację interfejsu z odtwarzaczem multimedialnym w odbiorniku internetowym.

W CAF większość tych zadań wykonuje klasa UIMediaController.

Nakładka wprowadzająca

Wersja 2 nie zawiera interfejsu nakładki wprowadzającej.

CAF udostępnia widok niestandardowy IntroductoryOverlay, który wyróżnia przycisk Cast, gdy jest on wyświetlany użytkownikom po raz pierwszy.

Minikontroler

W wersji 2 musisz zaimplementować minikontroler od podstaw w aplikacji nadawcy.

W CAF pakiet SDK udostępnia widok niestandardowy MiniControllerFragment, który możesz dodać do pliku układu aplikacji w przypadku aktywności, w których chcesz wyświetlać miniodtwarzacz.

Powiadomienia i ekran blokady

W wersji 2 kontrolery powiadomień i ekranu blokady nie są dostarczane przez pakiet SDK. W przypadku tego pakietu SDK musisz wbudować te funkcje w aplikację nadawcy, korzystając z interfejsów API platformy Android.

W CAF pakiet SDK udostępnia klasę NotificationsOptions.Builder, która pomaga utworzyć w aplikacji nadawcy opcje sterowania multimediami na ekranie blokady i w powiadomieniach. Opcje sterowania na ekranie blokady i w powiadomieniach można włączyć za pomocą klasy CastOptions podczas inicjowania 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();
}

Rozwinięty kontroler

W wersji 2 musisz od podstaw zaimplementować rozszerzony kontroler w aplikacji nadawcy.

CAF udostępnia klasę pomocniczą UIMediaController, która ułatwia tworzenie własnego rozszerzonego kontrolera.

CAF dodaje gotowy widżet rozszerzonego kontrolera ExpandedControllerActivity, który możesz po prostu dodać do aplikacji. Nie musisz już implementować niestandardowego rozszerzonego kontrolera za pomocą UIMediaController.

Aktywność audio

W wersji 2 do zarządzania fokusem dźwięku musisz używać MediaSessionCompat.

W CAF zaznaczenie dźwięku jest zarządzane automatycznie.

Logowanie debugowania

W CAF nie ma opcji logowania.

Przykładowe aplikacje

Mamy samouczki z ćwiczeniami z programowania i przykładowe aplikacje, które korzystają z CAF.