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 nadawcy na Androida z Cast SDK w wersji 2 na CAF Sender, który jest oparty na CastContext.

Pakiet Cast CAF Sender SDK 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

  • CAF Sender jest nadal rozpowszechniany w ramach usług Google Play za pomocą menedżera Android SDK.
  • Dodano nowe pakiety, które przejmują odpowiedzialność za przestrzeganie listy kontrolnej projektu Google Cast (com.google.android.gms.cast.framework.*).
  • CAF Sender udostępnia widżety zgodne z wymaganiami Cast UX. W wersji 2 nie było żadnych komponentów interfejsu, więc trzeba było je zaimplementować.
  • Do korzystania z Cast API nie jest już wymagane używanie GoogleApiClient.
  • Napisy w CAF Sender działają podobnie jak w wersji 2.

Zależności

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

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

Zdarzenie inicjujące

W CAF wymagany jest wyraźny krok inicjowania dla platformy Cast. Obejmuje to zainicjowanie singletonu CastContext za pomocą odpowiedniego OptionsProvider, aby określić identyfikator aplikacji Web Receiver 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>

Lenistwo 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 automatycznie uruchamiany i zatrzymywany przez platformę, gdy aplikacja przechodzi odpowiednio na pierwszy plan i w tle. Nie należy używać MediaRouteSelector ani MediaRouter.Callback.

Przycisk Cast i okno Cast

Podobnie jak w wersji 2, te komponenty są udostępniane 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 wyświetli 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ć) łączenia się z urządzeniem i uruchamiania aplikacji Web Receiver za pomocą GoogleApiClient. Interakcja między nadawcą a Web Receiver jest teraz reprezentowana jako „sesja”. Klasa SessionManager obsługuje cykl życia sesji oraz automatycznie rozpoczyna i zatrzymuje 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 sama 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łań zwrotnych dla wszystkich zdarzeń cyklu życia sesji.

Klasa CastSession reprezentuje sesję z urządzeniem przesyłającym. Ta klasa ma metody sterowania głośnością urządzenia i stanem wyciszenia, co wcześniej w wersji 2 odbywało się za pomocą metod w Cast.CastApi.

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

W CAF powiadomienia o zmianie głośności lub stanu wyciszenia są nadal dostarczane za pomocą wywołań zwrotnych metod w Cast.Listener. Te odbiorniki są zarejestrowane w CastSession. Wszystkie pozostałe powiadomienia o stanie urządzenia są dostarczane za pomocą CastStateListener wywołań zwrotnych. Te odbiorniki są zarejestrowane w CastSession. Pamiętaj, aby wyrejestrować odbiorniki, gdy powiązane fragmenty, aktywności lub aplikacje przechodzą w tle.

Logika ponownego łączenia

Podobnie jak w 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. Odbywa się to teraz na poziomie sesji. Sesja może przejść w stan „zawieszony”, gdy połączenie zostanie utracone, i wróci do stanu „połączony”, gdy łączność zostanie przywrócona. W ramach tego procesu platforma zajmuje się ponownym łączeniem z aplikacją Web Receiver i ponownym łączeniem wszystkich kanałów Cast.

CAF dodaje też 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 w tle lub zamknięta (przez przesunięcie lub z powodu awarii) podczas trwającej sesji Cast, platforma spróbuje wznowić tę sesję, gdy aplikacja nadawcy wróci na pierwszy plan lub zostanie ponownie uruchomiona. Jest to obsługiwane automatycznie przez SessionManager, który wyśle odpowiednie wywołania zwrotne do wszystkich zarejestrowanych SessionManagerListener instancji.

Rejestracja kanału niestandardowego

W wersji 2 kanały niestandardowe (zaimplementowane 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ż wyraźnie rejestrować kanału sterowania multimediami za pomocą Cast.CastApi.setMessageReceivedCallbacks. Więcej informacji znajdziesz w następnej sekcji.

Sterowanie multimediami

Klasa w wersji 2 RemoteMediaPlayer jest wycofana i nie należy jej używać. W CAF zastępuje ją nowa RemoteMediaClient klasa, która zapewnia równoważną funkcjonalność w wygodniejszym interfejsie API. Nie trzeba wyraźnie inicjować ani rejestrować tego obiektu. Platforma automatycznie utworzy instancję obiektu i zarejestruje podstawowy kanał multimedialny w momencie rozpoczęcia sesji, jeśli aplikacja Web Receiver, z którą się łączysz, obsługuje przestrzeń nazw multimediów.

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

W wersji 2 wszystkie żądania multimedialne wysyłane do RemoteMediaPlayer zwracały RemoteMediaPlayer.MediaChannelResult za pomocą wywołania zwrotnego PendingResult.

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

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

W CAF RemoteMediaClient udostępnia równoważne wywołania zwrotne za pomocą interfejsu RemoteMediaClient.Listener. W RemoteMediaClient można zarejestrować dowolną liczbę odbiorników, co umożliwia wielu komponentom nadawcy udostępnianie pojedynczej instancji RemoteMediaClient powiązanej z sesją.

W wersji 2 aplikacja nadawcy musiała synchronizować interfejs użytkownika ze stanem odtwarzacza multimediów w Web Receiver.

W CAF większość tej odpowiedzialności przejmuje klasa UIMediaController.

Nakładka wprowadzająca

W wersji 2 nie ma interfejsu nakładki wprowadzającej.

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

Mini kontroler

W wersji 2 musisz zaimplementować mini kontroler od zera w aplikacji nadawcy.

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

Powiadomienia i ekran blokady

W wersji 2 pakiet SDK nie udostępnia kontrolerów powiadomień i ekranu blokady. W przypadku tego pakietu SDK musisz wbudować te funkcje w aplikację nadawcy za pomocą interfejsów Android Framework API.

W CAF pakiet SDK udostępnia NotificationsOptions.Builder, który pomaga tworzyć elementy sterujące multimediami na potrzeby powiadomień i ekranu blokady w aplikacji nadawcy. Elementy sterujące powiadomieniami i ekranem blokady można włączyć za pomocą 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 zaimplementować rozwinięty kontroler od zera w aplikacji nadawcy.

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

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

Aktywność audio

W wersji 2 do zarządzania aktywnością audio musisz używać MediaSessionCompat.

W CAF aktywność audio jest zarządzana automatycznie.

Logowanie debugowania

W CAF nie ma opcji logowania.

Przykładowe aplikacje

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