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.