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

Poniższa procedura pozwala przekonwertować aplikację nadawcy na Androida z pakietu SDK Cast w wersji 2 na aplikację nadawcy CAF opartą na CastContext.

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

Wstęp

  • Jest on nadal rozpowszechniany w ramach Usług Google Play za pomocą menedżera pakietów SDK Androida.
  • 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 zawiera żadnych komponentów UI i wymaga wdrożenia takich widżetów.
  • Nie musisz już używać GoogleApiClient do używania interfejsu Cast API.
  • Funkcja wyświetlania napisów w narzędziu CAF Sender jest podobna do wersji 2.

Zależności

Wersja 2 i CAF są powiązane z bibliotekami pomocniczymi i usługami Google Play (9.2.0 lub nowszym) zgodnie z opisem w przewodniku po funkcjach bibliotek pomocniczych.

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

Zdarzenie inicjujące

W CAF dla platformy Cast wymagany jest etap jawnego inicjowania. Polega to na zainicjowaniu pojedynczego parametru CastContext przy użyciu odpowiedniego elementu OptionsProvider w celu określenia identyfikatora aplikacji internetowej 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” 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>

Leniwe zainicjowanie elementu CastContext w metodzie onCreate każdego działania:

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 czynności 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 przechodzi w tle. Nie należy używać właściwości MediaRouteSelector ani MediaRouter.Callback.

Przycisk Cast i okno przesyłania

Tak jak w wersji 2, komponenty te są udostępniane przez bibliotekę pomocy MediaRouter.

Przycisk Cast jest nadal zaimplementowany przez interfejs MediaRouteButton i można go dodać do aktywności (za pomocą ActionBar lub Toolbar) jako pozycji 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 CastButtonFactory do podłączenia MediaRouteButton do platformy przesyłania:

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łania.

Sterowanie urządzeniem

W CAF sterowanie urządzeniami jest w dużej mierze obsługiwane przez platformę. Aplikacja nadawcy nie musi obsługiwać (i nie próbować tego robić) nawiązywania połączeń z urządzeniem ani uruchamiania aplikacji odbiornika internetowego za pomocą GoogleApiClient. Interakcja między nadawcą a odbiornikiem internetowym jest teraz przedstawiana jako „sesja”. Klasa SessionManager obsługuje cykl życia sesji i automatycznie uruchamia i zatrzymuje ją 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, gdy użytkownik kliknie przycisk „Zatrzymaj przesyłanie” w oknie przesyłania lub sama aplikacja nadawcy się zakończy. Aplikacja nadawcy może być powiadamiana 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. Klasa zawiera metody sterowania głośnością urządzenia i stanami wyciszenia, co wcześniej było możliwe w wersji 2 za pomocą metod na 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 stanu głośności/wyciszenia są nadal dostarczane za pomocą metod wywołania zwrotnego w komponencie Cast.Listener. Te detektory są zarejestrowane w CastSession. Wszystkie pozostałe powiadomienia o stanie urządzenia są dostarczane za pomocą wywołań zwrotnych CastStateListener. Te detektory są zarejestrowane w CastSession. Pamiętaj, aby detektor nadal wyrejestrowywać, gdy powiązane fragmenty, działania lub aplikacje zaczynają działać w tle.

Zasada ponownego połączenia

Tak 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. Obecnie odbywa się to na poziomie sesji. Po utracie połączenia sesja może przejść do stanu „zawieszona”, a po przywróceniu połączenia wróci do stanu „połączona”. W ramach tego procesu platforma ponownie łączy się z aplikacją Web Odbieranie i podłącza wszystkie kanały Cast.

Dodatkowo CAF dodaje też automatyczne wznawianie sesji, które jest domyślnie włączone (i można je dezaktywować w CastOptions). Jeśli w trakcie sesji przesyłania aplikacja nadawcy jest wysyłana w tle lub zostaje zamknięta (przez przesunięcie palcem poza ekran lub w wyniku awarii), 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óre uruchamia odpowiednie wywołania zwrotne w każdej 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ą zamiast tego rejestrowane w instancji CastSession. Rejestrację można przeprowadzić za pomocą metody wywołania zwrotnego SessionManagerListener.onSessionStarted. W przypadku aplikacji multimedialnych nie musisz już rejestrować kanału sterowania multimediami za pomocą Cast.CastApi.setMessageReceivedCallbacks. Więcej informacji znajdziesz w kolejnej sekcji.

Sterowanie multimediami

Klasa v2 RemoteMediaPlayer została wycofana i nie należy jej używać. W CAF została ona zastąpiona przez nową klasę RemoteMediaClient, która ma odpowiednik w bardziej wygodnym interfejsie API. Nie jest konieczne bezpośrednie inicjowanie ani rejestrowanie tego obiektu. Platforma automatycznie utworzy instancję obiektu i zarejestruje bazowy kanał multimediów w momencie rozpoczęcia sesji, jeśli podłączona aplikacja internetowa odbiorcy obsługuje przestrzeń nazw multimediów.

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

W wersji 2 wszystkie żądania mediów wysłane za pomocą RemoteMediaPlayer zwracałyby wartość RemoteMediaPlayer.MediaChannelResult za pomocą wywołania zwrotnego PendingResult.

W CAF wszystkie żądania mediów wysłane za pomocą RemoteMediaClient zwracają wywołanie RemoteMediaClient.MediaChannelResult za pomocą wywołania zwrotnego PendingResult, co można wykorzystać do śledzenia postępu i ostatecznych wyników żądania.

RemoteMediaPlayer w wersji 2 wysyła powiadomienia o zmianach stanu odtwarzacza multimediów w odbiorniku internetowym za pomocą RemoteMediaPlayer.OnStatusUpdatedListener.

W CAF RemoteMediaClient zapewnia równoważne wywołania zwrotne za pomocą swojego interfejsu RemoteMediaClient.Listener. W RemoteMediaClient można zarejestrować dowolną liczbę detektorów, co umożliwia wielu komponentom nadawcy udostępnianie pojedynczego wystąpienia zdarzenia RemoteMediaClient powiązanego z daną sesją.

W wersji 2 aplikacja nadawcy musiała przejąć odpowiedzialność za synchronizację interfejsu użytkownika ze stanem odtwarzacza w odbiorniku internetowym.

W CAF klasa UIMediaController przejmuje większość tego zadania.

Nakładka z wprowadzeniem

Wersja 2 nie zapewnia wprowadzającego interfejsu użytkownika nakładki.

CAF udostępnia widok niestandardowy IntroductoryOverlay, w którym można podświetlić przycisk przesyłania, gdy po raz pierwszy zostanie on wyświetlony użytkownikom.

Minikontroler

Wersja 2 wymaga zaimplementowania od podstaw minikontrolera w aplikacji nadawcy.

W CAF pakiet SDK udostępnia widok niestandardowy MiniControllerFragment. Możesz go dodać do pliku układu aplikacji działań, w których chcesz pokazać minikontroler.

Powiadomienia i ekran blokady

W wersji 2 pakiet SDK nie zapewnia kontrolerów do obsługi powiadomień i ekranu blokady. W przypadku tego pakietu SDK musisz umieścić te funkcje w 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 na potrzeby powiadomień i ekranu blokady w aplikacji nadawcy. Ustawienia powiadomień i ekranu blokady można włączyć przy użyciu elementu CastOptions podczas inicjowania aplikacji 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

Wersja 2 wymaga zaimplementowania od podstaw rozwiniętego kontrolera w aplikacji nadawcy.

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

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

Aktywność audio

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

W CAF sterowanie dźwiękiem odbywa się automatycznie.

Logowanie debugowania

W CAF nie ma opcji logowania.

Przykładowe aplikacje

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