Poniższa procedura umożliwia przekształcenie aplikacji przesyłającej na Androidzie z CastSDK w wersji 2 na przesyłacz CAF, który jest oparty na encji CastContext.
Pakiet SDK przesyłającego treści w ramach usługi Cast CAF używa interfejsu CastContext do zarządzania w Twoim imieniu interfejsem GoogleAPIClient. Komponent CastContext zarządza cyklem życia, błędami i wywołaniami zwrotnymi, co znacznie upraszcza tworzenie aplikacji Cast.
Wprowadzenie
- Serwer CAF Sender jest nadal rozpowszechniany w ramach usług Google Play za pomocą menedżera pakietu SDK Androida.
- Dodano nowe pakiety, które przejmują odpowiedzialność za zgodność z listą kontrolną Google Cast Design (
com.google.android.gms.cast.framework.*
). - CAF Sender udostępnia widżety zgodne z wymaganiami dotyczącymi UX Cast. Wersja 2 nie udostępniała żadnych komponentów interfejsu użytkownika i wymagała ich implementacji.
- Do korzystania z interfejsu Cast API nie jest już wymagane używanie klasy GoogleApiClient.
- Wyświetlanie napisów w CAF Sender jest podobne do wersji 2.
Zależności
Wersja 2 i CAF mają te same zależności od bibliotek pomocniczych i usług Google Play (9.2.0 lub nowszych), jak opisano w przewodniku po funkcjach bibliotek pomocniczych.
Minimalna wersja pakietu Android SDK obsługiwana przez CAF to 9 (Gingerbread).
Zdarzenie inicjujące
W CAF wymagany jest wyraźny krok inicjalizacji dla platformy Cast. Polega to na zainicjowaniu singletona CastContext
za pomocą odpowiedniej funkcji 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>
W metodzie onCreate
każdej aktywności zainicjuj CastContext
w sposób leniwy:
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 framework, gdy aplikacja przechodzi na pierwszy plan lub tło. Nie należy używać zasad MediaRouteSelector
ani MediaRouter.Callback
.
Przycisk Cast i okno Cast
Podobnie jak w wersji 2, te komponenty są udostępniane przez bibliotekę obsługi MediaRouter.
Przycisk Prześlij 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 do tego metody CastButtonFactory
, aby połączyć MediaRouteButton
z ramami 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 kontrola urządzenia jest w dużej mierze obsługiwana przez platformę. Aplikacja nadawcza nie musi obsługiwać (i nie powinna próbować obsługiwać) połączenia z urządzeniem i uruchamiania aplikacji Web Receiver za pomocą GoogleApiClient
. Interakcje między nadawcą a odbiorcą internetowym są teraz reprezentowane jako „sesja”. Klasa SessionManager
zarządza cyklem życia sesji i automatycznie uruchamia oraz zatrzymuje sesje w odpowiedzi na gesty użytkownika: sesja jest uruchamiana, gdy użytkownik wybierze urządzenie Cast w oknie Cast, a zakończona, gdy użytkownik kliknie przycisk „Zatrzymaj przesyłanie” w oknie Cast lub gdy aplikacja wysyłająca zostanie zamknięta. Aplikacja nadawcza może otrzymywać powiadomienia o zdarzeniach związanych z cyklem życia sesji, rejestrując zdarzenie SessionManagerListener
w usługach SessionManager
. SessionManagerListener
definiuje metody wywołania 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 w wersji 2 były realizowane za pomocą metod klasy Cast.CastApi
.
W wersji 2 wywołania zwrotne Cast.Listener
informowały o zmianach stanu urządzenia, takich jak głośność, wyciszenie, stan czuwania itp.
W CAF powiadomienia o zmianie głośności/stanu wyciszenia są nadal dostarczane za pomocą metod wywołania zwrotnego w Cast.Listener
. Te odbiorcy są zarejestrowani w CastSession
.
Wszystkie pozostałe powiadomienia o stanie urządzenia są dostarczane za pomocą funkcji CastStateListener
. Te odsłuchujące funkcje są zarejestrowane w CastSession
. Pamiętaj, aby nadal rejestrować słuchaczy, gdy powiązane fragmenty, czynności lub aplikacje przechodzą na drugi plan.
Zasada ponownego połą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 sieciowych. Teraz jest to wykonywane na poziomie sesji. Po przerwaniu połączenia sesja może przejść w stan „zawieszona”, a po przywróceniu połączenia wróci do stanu „połączono”. W ramach tego procesu framework dba o ponowne połączenie z aplikacją Web Receiver i ponowne połączenie wszystkich kanałów Cast.
Dodatkowo CAF umożliwia automatyczne wznawianie sesji, które jest domyślnie włączone (można je wyłączyć za pomocą CastOptions
).
Jeśli aplikacja nadawcza zostanie wysłana do tła lub zamknięta (przez przesunięcie lub z powodu awarii), gdy trwa sesja przesyłania, framework spróbuje wznowić tę sesję, gdy aplikacja nadawcza powróci na pierwszy plan lub zostanie ponownie uruchomiona. Obsługa odbywa się automatycznie przez SessionManager
, który wyśle odpowiednie wywołania zwrotne do wszystkich zarejestrowanych instancji SessionManagerListener
.
Rejestracja kanału niestandardowego
W wersji 2 kanały niestandardowe (wdrażane za pomocą interfejsu Cast.MessageReceivedCallback
) są rejestrowane za pomocą interfejsu Cast.CastApi
. W przypadku 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 v2
RemoteMediaPlayer
została wycofana i nie należy jej używać. W CAF została ona zastąpiona nową klasą RemoteMediaClient
, która zapewnia równoważne funkcje w wygodniejszym interfejsie API. Nie trzeba jawnie inicjować ani rejestrować tego obiektu. Jeśli połączona aplikacja Web Receiver obsługuje przestrzeń nazw mediów, framework automatycznie utworzy instancję obiektu i zarejestruje kanał multimediów na początku sesji.
Do RemoteMediaClient
można uzyskać dostęp jako do metody getRemoteMediaClient
obiektu CastSession
.
W wersji 2 wszystkie żądania multimediów wysyłane na adres RemoteMediaPlayer
zwracałyby odpowiedź RemoteMediaPlayer.MediaChannelResult
za pomocą wywołania zwrotnego PendingResult
.
W CAF wszystkie żądania dotyczące multimediów wysyłane na adres RemoteMediaClient
zwracają odpowiedź RemoteMediaClient.MediaChannelResult
za pomocą funkcji wywołania zwrotnego PendingResult
, która umożliwia śledzenie postępów i ostatecznego wyniku żądania.
W wersji 2 RemoteMediaPlayer
wysyłane były powiadomienia o zmianach stanu odtwarzacza multimediów w Web Receiver za pomocą interfejsu RemoteMediaPlayer.OnStatusUpdatedListener
.
W CAF funkcja RemoteMediaClient
udostępnia wywołania zwrotne o odpowiednich parametrach za pomocą interfejsu RemoteMediaClient.Listener
. Z usługą RemoteMediaClient
można zarejestrować dowolną liczbę słuchaczy, co pozwala wielu komponentom nadawcy udostępniać pojedynczy egzemplarz usługi RemoteMediaClient
powiązanej z sesją.
W wersji 2 aplikacja nadawcza musiała dbać o to, aby interfejs użytkownika był zsynchronizowany ze stanem odtwarzacza multimediów w odbiorniku internetowym.
W CAF klasa UIMediaController
przejmuje większość tej odpowiedzialności.
Wstępna nakładka
W wersji 2 nie ma interfejsu z wprowadzającą nakładką.
CAF udostępnia widok niestandardowyIntroductoryOverlay
, aby wyróżnić przycisk Cast, gdy po raz pierwszy pojawia się on użytkownikom.
Mini kontroler
W wersji 2 musisz od podstaw zaimplementować w aplikacji nadawcy minikontroler.
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ć minikontroler.
Powiadomienia i ekran blokady
W wersji 2 pakiet SDK nie udostępnia kontrolerów powiadomień ani ekranu blokady. W przypadku tego pakietu SDK musisz zaimplementować te funkcje w aplikacji nadawcy, korzystając z interfejsów API frameworku Androida.
W CAF pakiet SDK udostępnia interfejs NotificationsOptions.Builder
, który ułatwia tworzenie elementów sterujących multimediami na ekranie blokady i w powiadomieniach w aplikacji nadawcy. Elementy sterujące na ekranie blokady i w powiadomieniach można włączyć za pomocą interfejsu 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łasnych rozszerzonych kontrolerów.
CAF dodaje gotowy rozszerzony kontroler ExpandedControllerActivity
, który możesz po prostu dodać do aplikacji. Nie musisz już wdrażać niestandardowego rozszerzonego kontrolera za pomocą UIMediaController
.
Aktywność audio
W wersji 2 do zarządzania skupieniem dźwięku musisz używać MediaSessionCompat
.
W CAF dźwiękiem zarządza się automatycznie.
Logowanie debugowania
W CAF nie ma opcji logowania.
Przykładowe aplikacje
Mamy samouczki z laboratorium kodu i przykładowe aplikacje, które korzystają z CAF.