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 pakietu Cast SDK w wersji 2 na nadawcę CAF, który jest oparty na pojedynczej instancji CastContext.

Pakiet SDK nadawcy Cast CAF 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 pakietu SDK Androida.
  • Dodaliśmy nowe pakiety, które przejmują odpowiedzialność za zgodność z listą kontrolną projektu Google Cast (com.google.android.gms.cast.framework.*).
  • CAF Sender udostępnia widżety zgodne z wymaganiami dotyczącymi UX Cast. W wersji 2 nie było żadnych komponentów interfejsu, więc trzeba było je zaimplementować.
  • Używanie interfejsu GoogleApiClient nie jest już wymagane do korzystania z interfejsu Cast API.
  • Napisy w CAF Sender działają podobnie jak w wersji 2.

Zależności

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

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

Zdarzenie inicjujące

W CAF wymagany jest jawny krok inicjowania platformy Cast. Obejmuje to inicjowanie CastContext singletonu za pomocą odpowiedniego OptionsProvider do określania identyfikatora aplikacji odbiornika internetowego i innych opcji globalnych.

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 automatycznie uruchamiany i zatrzymywany przez platformę, gdy aplikacja przechodzi na pierwszy plan i do tła. Nie należy używać zasad MediaRouteSelectorMediaRouter.Callback.

Przycisk Cast i okno Cast

Podobnie jak w przypadku wersji 2, te komponenty są udostępniane przez bibliotekę obsługi MediaRouter.

Przycisk Prześlij jest nadal implementowany przez element MediaRouteButton i można go dodać do aktywności (za pomocą elementu 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żdego działania, używając CastButtonFactory do połączenia 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 przesyłania.

Sterowanie urządzeniem

W CAF sterowanie urządzeniem jest w dużej mierze obsługiwane przez platformę. Aplikacja wysyłająca 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 zarządza cyklem życia sesji i 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 kliknie przycisk „Zatrzymaj przesyłanie” w oknie Cast lub gdy sama aplikacja wysyłająca zostanie zamknięta. Aplikacja nadawcy może otrzymywać powiadomienia o zdarzeniach w cyklu życia sesji, rejestrując SessionManagerListenerSessionManager. Wywołania zwrotne SessionManagerListener definiują metody wywołań zwrotnych dla wszystkich zdarzeń związanych z cyklem życia sesji.

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

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

W CAF powiadomienia o zmianie głośności lub stanu wyciszenia są nadal dostarczane za pomocą metod wywołania zwrotnego w Cast.Listener. Te odbiorniki są rejestrowane w CastSession. Pozostałe powiadomienia o stanie urządzenia są dostarczane za pomocą wywołań zwrotnych CastStateListener. Te odbiorniki są rejestrowane w CastSession. Pamiętaj, aby wyrejestrowywać odbiorców, gdy powiązane fragmenty, aktywności lub aplikacje przechodzą w tło.

Logika ponownego łączenia

Podobnie jak w przypadku wersji 2, CAF próbuje przywrócić 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, a po przywróceniu łączności wróci do stanu „połączono”. W ramach tego procesu platforma zajmuje się ponownym łączeniem z aplikacją Web Receiver i ponownym łączeniem kanałów Cast.

CAF dodaje też automatyczne wznawianie sesji, które jest domyślnie włączone (można je wyłączyć za pomocą CastOptions). Jeśli aplikacja nadawcy zostanie przeniesiona w tle lub zakończona (przez przesunięcie palcem lub z powodu awarii) podczas trwania 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 wywołuje odpowiednie wywołania zwrotne w przypadku wszystkich zarejestrowanych instancji SessionManagerListener.

Rejestracja kanału niestandardowego

W wersji 2 kanały niestandardowe (wdrożone za pomocą tagu Cast.MessageReceivedCallback) są rejestrowane za pomocą tagu 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ż rejestrować kanału sterowania multimediami za pomocą Cast.CastApi.setMessageReceivedCallbacks. Więcej informacji znajdziesz w następnej sekcji.

Sterowanie multimediami

Klasa v2RemoteMediaPlayer została wycofana i nie należy jej używać. W CAF zastępuje ją nowa klasa RemoteMediaClient, która zapewnia równoważną funkcjonalność w wygodniejszym interfejsie API. Nie musisz jawnie inicjować ani rejestrować tego obiektu. Platforma automatycznie utworzy instancję obiektu i zarejestruje bazowy kanał multimedialny na początku 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 na RemoteMediaPlayer zwracały RemoteMediaPlayer.MediaChannelResult za pomocą wywołania zwrotnego PendingResult.

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

Interfejs v2 RemoteMediaPlayer wysyłał powiadomienia o zmianach stanu odtwarzacza multimediów w odbiorniku internetowym za pomocą interfejsu 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ę odbiorców, co umożliwia wielu komponentom wysyłającym udostępnianie pojedynczej instancji RemoteMediaClient powiązanej z sesją.

W wersji 2 aplikacja wysyłająca musiała dbać o synchronizację interfejsu użytkownika ze stanem odtwarzacza multimediów na odbiorniku internetowym.

W CAF większość tej odpowiedzialności spoczywa na klasie UIMediaController.

Nakładka wprowadzająca

Wersja 2 nie zawiera nakładki wprowadzającej w interfejsie.

CAF udostępnia niestandardowy widokIntroductoryOverlay, aby wyróżnić przycisk Cast, gdy po raz pierwszy pojawi się on użytkownikom.

Mini kontroler

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

W CAF pakiet SDK udostępnia niestandardowy widok, 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 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 API platformy Android.

W CAF pakiet SDK udostępnia interfejs NotificationsOptions.Builder, który pomaga w tworzeniu w aplikacji nadawcy elementów sterujących multimediami na potrzeby powiadomień i ekranu blokady. Elementy sterujące powiadomieniami i ekranem blokady można włączyć za pomocą interfejsu CastOptions podczas inicjowania interfejsu 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 zera zaimplementować rozszerzony kontroler w aplikacji nadawcy.

CAF udostępnia UIMediaControllerklasę pomocniczą, która ułatwia tworzenie własnego rozszerzonego 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 fokusem dźwięku musisz używać MediaSessionCompat.

W CAF ostrość dźwięku jest zarządzana automatycznie.

Logowanie debugowania

W CAF nie ma opcji logowania.

Przykładowe aplikacje

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