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 MediaRouteSelector
i MediaRouter.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 SessionManagerListener
w SessionManager
. 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 UIMediaController
klasę 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 programowania i przykładowe aplikacje, które korzystają z CAF.