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

Wykonując poniższą procedurę, możesz przekonwertować aplikację nadawcy na Androida z pakietu Cast SDK w wersji 2 na funkcję CAF Sender, która bazuje na pojedynczym tonie CastContext.

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

Wstęp

  • Nadawca CAF jest nadal rozpowszechniany w ramach Usług Google Play za pomocą Menedżera pakietów SDK na Androida,
  • Dodaliśmy nowe pakiety, które odpowiadają za zgodność z listą kontrolną projektu Google Cast (com.google.android.gms.cast.framework.*)
  • CAF Sender udostępnia widżety, które spełniają wymagania UX Cast. Wersja 2 nie zawierała żadnych komponentów interfejsu i wymagała ich zaimplementowania.
  • Aby korzystać z interfejsu Cast API, nie musisz już używać GoogleApiClient.
  • Napisy w funkcji CAF Sender są podobne do wersji 2.

Zależności

W wersjach 2 i CAF obowiązują te same zależności od bibliotek pomocy i usług Google Play (w wersji 9.2.0 lub nowszej) zgodnie z opisem 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 jawny krok inicjowania platformy Cast. Wiąże się to z zainicjowaniem metody CastContextsingleton przy użyciu odpowiedniego polecenia OptionsProvider do określenia identyfikatora aplikacji odbiornika internetowego oraz wszelkich 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” 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>

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

Te czynności nie były konieczne w wersji 2.

Wykrywanie urządzeń

W CAF proces wykrywania jest uruchamiany i zatrzymywany automatycznie przez platformę, gdy aplikacja pojawia się na pierwszym planie i odpowiednio przechodzi do działania w tle. Nie należy używać atrybutów MediaRouteSelector i MediaRouter.Callback.

Przycisk przesyłania i okno przesyłania

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

Przycisk Cast jest nadal zaimplementowany w aplikacji MediaRouteButton i można go dodać do aktywności (za pomocą ActionBar lub Toolbar) jako pozycję menu w 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 polecenia CastButtonFactory do łączenia interfejsu 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 Przesyłaj.

Sterowanie urządzeniem

W CAF sterowanie urządzeniem jest obsługiwane w dużej mierze przez platformę. Aplikacja nadawcy nie musi obsługiwać (i nie powinna próbować obsługiwać) łączenia się z urządzeniem ani uruchamiania aplikacji odbiornika internetowego za pomocą funkcji GoogleApiClient. Interakcja między nadawcą a odbiornikiem internetowym jest teraz reprezentowana jako „sesja”. Klasa SessionManager obsługuje cykl życia sesji i automatycznie rozpoczyna i zatrzymuje sesję w odpowiedzi na gesty użytkownika. Sesja rozpoczyna się, gdy użytkownik wybierze urządzenie przesyłające w oknie przesyłania, i kończy się, gdy użytkownik kliknie przycisk „Zatrzymaj przesyłanie” w oknie Cast lub sama aplikacja nadawcy się zakończy. Aplikacja nadawcy może otrzymywać powiadomienia o zdarzeniach cyklu życia sesji przez zarejestrowanie 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. Klasa zawiera metody sterowania głośnością urządzenia i stanami wyciszenia, które wcześniej były dostępne w wersji 2 za pomocą metod w Cast.CastApi.

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

W CAF powiadomienia o zmianie głośności/stanu wyciszenia są nadal dostarczane przy użyciu metod wywołania zwrotnego w Cast.Listener; detektory są zarejestrowani w usłudze 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 nadal wyrejestrowywać detektory, gdy powiązane fragmenty, działania lub aplikacje będą działać w tle.

Logika ponownego połączenia

Tak jak w wersji 2, CAF próbuje ponownie nawiązać połączenia sieciowe, które zostało utracone z powodu tymczasowej utraty sygnału Wi-Fi lub innych błędów sieci. Obecnie odbywa się to na poziomie sesji. Sesja może wchodzić w stan „zawieszone”, gdy połączenie zostanie utracone, i wróci do stanu „połączonego” po przywróceniu połączenia. Platforma zapewnia ponowne połączenie z aplikacją Web Receiver oraz wszystkie kanały Cast.

Oprócz tego funkcja CAF dodaje też automatyczne wznawianie sesji, które jest domyślnie włączone (i można je dezaktywować za pomocą CastOptions). Jeśli aplikacja wysyłająca zostanie wysłana w tle lub zostanie zamknięta (przez przesuwanie palcem lub awaria) w trakcie sesji przesyłania, ramka spróbuje wznowić tę sesję, gdy aplikacja nadawcy powróci na pierwszy plan lub zostanie ponownie uruchomiona. SessionManager generuje odpowiednie wywołania zwrotne we wszystkich zarejestrowanych instancjach SessionManagerListener.

Rejestracja kanału niestandardowego

W wersji 2 kanały niestandardowe (zaimplementowane za pomocą Cast.MessageReceivedCallback) są zarejestrowane w Cast.CastApi. W CAF kanały niestandardowe są rejestrowane w instancji CastSession. Rejestracji można dokonać za pomocą metody wywołania zwrotnego SessionManagerListener.onSessionStarted. W przypadku aplikacji multimedialnych nie jest już konieczne bezpośrednie rejestrowanie kanału sterowania multimediami za pomocą interfejsu Cast.CastApi.setMessageReceivedCallbacks. Więcej informacji znajdziesz w kolejnej sekcji.

Sterowanie multimediami

Klasa w wersji 2 RemoteMediaPlayer została wycofana i nie należy jej używać. W CAF zastępuje ją nowa klasa RemoteMediaClient, która oferuje te same funkcje w bardziej wygodnym interfejsie API. Nie jest konieczne bezpośrednie inicjowanie ani rejestrowanie tego obiektu. Platforma automatycznie utworzy instancję obiektu i zarejestruje bazowy kanał mediów przy rozpoczęciu sesji, jeśli połączona aplikacja odbiornika internetowego obsługuje przestrzeń nazw multimediów.

Dostęp do RemoteMediaClient jest możliwy jako metoda getRemoteMediaClient obiektu CastSession.

W wersji 2 wszystkie żądania mediów wysyłane na RemoteMediaPlayer zwracały żądanie RemoteMediaPlayer.MediaChannelResult za pomocą wywołania zwrotnego PendingResult.

W CAF wszystkie żądania mediów wysyłane w RemoteMediaClient zwracają RemoteMediaClient.MediaChannelResult za pomocą wywołania zwrotnego PendingResult, które może służyć do śledzenia postępów i ostatecznego wyniku żądania.

RemoteMediaPlayer w wersji 2 wysyła powiadomienia o zmianach stanu odtwarzacza w odbiorniku internetowym przez RemoteMediaPlayer.OnStatusUpdatedListener.

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

W wersji 2 aplikacja nadawcy musiała przyjąć na siebie ciężar utrzymywania synchronizacji interfejsu użytkownika ze stanem odtwarzacza w odbiorniku internetowym.

W CAF za większość tego odpowiedzialności odpowiada klasa UIMediaController.

Nakładka wprowadzająca

Wersja 2 nie udostępnia wprowadzającego interfejsu użytkownika nakładki.

CAF udostępnia widok niestandardowy IntroductoryOverlay do wyróżnienia przycisku przesyłania, gdy jest on wyświetlany użytkownikom po raz pierwszy.

Minikontroler

W wersji 2 musisz wdrożyć od podstaw minikontroler w aplikacji nadawcy.

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

Powiadomienia i ekran blokady

W wersji 2 pakiet SDK nie udostępnia kontrolerów do obsługi powiadomień i ekranu blokady. W przypadku tego pakietu SDK musisz dodać te funkcje do aplikacji nadawcy za pomocą interfejsów API platformy Android.

W CAF pakiet SDK udostępnia NotificationsOptions.Builder, który ułatwia tworzenie opcji sterowania multimediami w przypadku powiadomień i ekranu blokady w aplikacji nadawcy. Ustawienia powiadomień i ekranu blokady można włączyć za pomocą interfejsu CastOptions podczas inicjowania funkcji 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 wdrożyć rozwinięty kontroler w aplikacji nadawcy.

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

CAF dodaje gotowy widżet rozszerzonego kontrolera ExpandedControllerActivity, który możesz łatwo dodać do aplikacji. Nie musisz już wdrażać niestandardowego rozwiniętego kontrolera za pomocą UIMediaController.

Aktywność audio

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

W CAF sterowanie dźwiękiem jest zarządzane automatycznie.

Logowanie debugowania

W CAF nie ma opcji logowania.

Przykładowe aplikacje

Opublikowaliśmy samouczki z programowania i przykładowe aplikacje, które korzystają z CAF.