Przerwy na reklamę
Pakiet Android Sender SDK zapewnia obsługę przerw na reklamy i reklam towarzyszących danego strumienia multimediów.
Zobacz Omówienie przerw na reklamy w odbiorniku internetowym, aby dowiedzieć się więcej jak działają przerwy na reklamę.
Chociaż przerwy można określić zarówno u nadawcy, jak i u odbiorcy, zalecamy, aby były one określone na odbiorniku internetowym oraz Odbiornik Android TV, aby zachować spójność zachowania użytkowników na różnych platformach.
W Androidzie przerwy na reklamę określ w poleceniu ładowania za pomocą:
AdBreakClipInfo
i AdBreakInfo
:
val breakClip1: AdBreakClipInfo = AdBreakClipInfo.Builder("bc0") .setTitle("Clip title") .setPosterUrl("https://www.some.url") .setDuration(60000) .setWhenSkippableInMs(5000) // Set this field so that the ad is skippable .build() val breakClip2: AdBreakClipInfo = … val breakClip3: AdBreakClipInfo = … val break1: AdBreakClipInfo = AdBreakInfo.Builder(/* playbackPositionInMs= */ 10000) .setId("b0") .setBreakClipIds({"bc0","bc1","bc2"}) … .build() val mediaInfo: MediaInfo = MediaInfo.Builder() … .setAdBreaks({break1}) .setAdBreakClips({breakClip1, breakClip2, breakClip3}) .build() val mediaLoadRequestData: MediaLoadRequestData = MediaInfo.Builder() … .setMediaInfo(mediaInfo) .build() remoteMediaClient.load(mediaLoadRequestData)
AdBreakClipInfo breakClip1 = new AdBreakClipInfo.Builder("bc0") .setTitle("Clip title") .setPosterUrl("https://www.some.url") .setDuration(60000) .setWhenSkippableInMs(5000) // Set this field so that the ad is skippable .build(); AdBreakClipInfo breakClip2 = … AdBreakClipInfo breakClip3 = … AdBreakInfo break1 = new AdBreakInfo.Builder(/* playbackPositionInMs= */ 10000) .setId("b0") .setBreakClipIds({"bc0","bc1","bc2"}) … .build(); MediaInfo mediaInfo = new MediaInfo.Builder() … .setAdBreaks({break1}) .setAdBreakClips({breakClip1, breakClip2, breakClip3}) .build(); MediaLoadRequestData mediaLoadRequestData = new MediaInfo.Builder() … .setMediaInfo(mediaInfo) .build(); remoteMediaClient.load(mediaLoadRequestData);
Dodawanie działań niestandardowych
Aplikacja nadawcy może rozszerzać zasięg
MediaIntentReceiver
obsługi niestandardowych działań lub zastępowania ich działania. Jeśli masz już wdrożony
MediaIntentReceiver
, musisz dodać go do pliku manifestu i ustawić także
w polu CastMediaOptions
. W tym przykładzie przedstawiono działania niestandardowe, które zastępują przełączanie odtwarzania multimediów z dalnie, naciskanie przycisku multimediów i inne rodzaje działań.
// In AndroidManifest.xml
<receiver android:name="com.example.MyMediaIntentReceiver" />
// In your OptionsProvider var mediaOptions = CastMediaOptions.Builder() .setMediaIntentReceiverClassName(MyMediaIntentReceiver::class.java.name) .build() // Implementation of MyMediaIntentReceiver internal class MyMediaIntentReceiver : MediaIntentReceiver() { override fun onReceiveActionTogglePlayback(currentSession: Session) { } override fun onReceiveActionMediaButton(currentSession: Session, intent: Intent) { } override fun onReceiveOtherAction(context: Context?, action: String, intent: Intent) { } }
// In your OptionsProvider CastMediaOptions mediaOptions = new CastMediaOptions.Builder() .setMediaIntentReceiverClassName(MyMediaIntentReceiver.class.getName()) .build(); // Implementation of MyMediaIntentReceiver class MyMediaIntentReceiver extends MediaIntentReceiver { @Override protected void onReceiveActionTogglePlayback(Session currentSession) { } @Override protected void onReceiveActionMediaButton(Session currentSession, Intent intent) { } @Override protected void onReceiveOtherAction(Context context, String action, Intent intent) { } }
Dodawanie kanału niestandardowego
Aby aplikacja nadawcy mogła komunikować się z aplikacją adresata, musi ona spełniać te warunki:
utworzyć kanał niestandardowy. Nadawca może używać kanału niestandardowego do wysyłania wiadomości tekstowych do odbiorcy. Każdy kanał niestandardowy jest definiowany przez
i musi zaczynać się od prefiksu urn:x-cast:
, na przykład
urn:x-cast:com.example.custom
Istnieje możliwość skonfigurowania wielu niestandardowych komponentów
z unikalną przestrzenią nazw. Aplikacja odbiornika może też
wysyłanie i odbieranie wiadomości
przy użyciu tej samej przestrzeni nazw.
Kanał niestandardowy jest zaimplementowany za pomocą
Cast.MessageReceivedCallback
interfejs:
class HelloWorldChannel : MessageReceivedCallback { val namespace: String get() = "urn:x-cast:com.example.custom" override fun onMessageReceived(castDevice: CastDevice, namespace: String, message: String) { Log.d(TAG, "onMessageReceived: $message") } }
class HelloWorldChannel implements Cast.MessageReceivedCallback { public String getNamespace() { return "urn:x-cast:com.example.custom"; } @Override public void onMessageReceived(CastDevice castDevice, String namespace, String message) { Log.d(TAG, "onMessageReceived: " + message); } }
Gdy aplikacja nadawcy połączy się z aplikacją adresata, kanał niestandardowy
utworzona za pomocą
setMessageReceivedCallbacks
:
try { mCastSession.setMessageReceivedCallbacks( mHelloWorldChannel.namespace, mHelloWorldChannel) } catch (e: IOException) { Log.e(TAG, "Exception while creating channel", e) }
try { mCastSession.setMessageReceivedCallbacks( mHelloWorldChannel.getNamespace(), mHelloWorldChannel); } catch (IOException e) { Log.e(TAG, "Exception while creating channel", e); }
Po utworzeniu kanału niestandardowego nadawca może użyć funkcji
sendMessage
, która pozwala wysłać za pomocą tego kanału komunikaty z ciągiem znaków do odbiorcy:
private fun sendMessage(message: String) { if (mHelloWorldChannel != null) { try { mCastSession.sendMessage(mHelloWorldChannel.namespace, message) .setResultCallback { status -> if (!status.isSuccess) { Log.e(TAG, "Sending message failed") } } } catch (e: Exception) { Log.e(TAG, "Exception while sending message", e) } } }
private void sendMessage(String message) { if (mHelloWorldChannel != null) { try { mCastSession.sendMessage(mHelloWorldChannel.getNamespace(), message) .setResultCallback( status -> { if (!status.isSuccess()) { Log.e(TAG, "Sending message failed"); } }); } catch (Exception e) { Log.e(TAG, "Exception while sending message", e); } } }
Obsługa autoodtwarzania
Więcej informacji znajdziesz w sekcji Autoodtwarzanie API do kolejkowania.
Zastępowanie wyboru obrazów w widżetach UX
Różne komponenty platformy (takie jak okno Cast, mini
a kontroler UIMediaController, jeśli został skonfigurowany)
dotyczące aktualnie przesyłanych multimediów. Adresy URL grafiki grafiki są zwykle
zawarte w polu MediaMetadata
dla multimediów, ale aplikacja nadawcy może mieć tag
alternatywnego źródła adresów URL.
ImagePicker
klasa określa sposób wyboru odpowiedniego obrazu z listy obrazów
w MediaMetadata
, na podstawie użycia obrazu, np. powiadomienia
miniatury lub pełnego ekranu. Domyślna implementacja funkcji ImagePicker
zawsze wybiera pierwszy obraz lub zwraca wartość null, jeśli w elementzie MediaMetadata
nie ma żadnego obrazu. Aplikacja może podklasa ImagePicker
i zastępować
onPickImage(MediaMetadata, ImageHints)
.
aby udostępnić alternatywną implementację, a następnie wybierz tę podklasę
z
setImagePicker
metody CastMediaOptions.Builder
.
ImageHints
informuje ImagePicker
o typie i rozmiarze obrazu, który ma zostać użyty
wybrany do wyświetlenia w interfejsie użytkownika.
Dostosowywanie okien przesyłania
Zarządzanie cyklem życia sesji
SessionManager
to centralne miejsce do zarządzania cyklem życia sesji. SessionManager
odsłuchanie
na Androida
MediaRouter
.
Stan wyboru trasy zmienia się na rozpoczęcie, wznawianie i zakończenie sesji. Gdy trasa jest
zaznaczono, SessionManager
utworzy
Session
.
i próbuje go uruchomić lub wznowić. Gdy nie wybierzesz trasy,
Aplikacja SessionManager
zakończy bieżącą sesję.
Dlatego, aby mieć pewność, że SessionManager
zarządza cyklami życia sesji prawidłowo,
musi zapewnić, że:
- W oknie selektora trasy:
zadzwoń
MediaRouter.selectRoute(MediaRouter.RouteInfo)
. gdy użytkownik wybiera urządzenie. - W oknie sterowania trasą (w stanie połączenia lub przesyłania) wywołaj funkcję
MediaRouter.unselect(int)
, gdy użytkownik przestanie przesyłać.
W zależności od sposobu tworzenia dialogów przesyłania danych może być konieczne wykonanie dodatkowych czynności:
- Jeśli okna Cast tworzysz za pomocą
MediaRouteChooserDialog
orazMediaRouteControllerDialog
, te okna automatycznie zaktualizują wybór trasy wMediaRouter
, więc nic nie trzeba robić. - Jeśli do konfigurowania przycisku przesyłania używasz
CastButtonFactory.setUpMediaRouteButton(Context, Menu, int)
lubCastButtonFactory.setUpMediaRouteButton(Context, MediaRouteButton)
, to dialogi utworzono za pomocą narzędziMediaRouteChooserDialog
iMediaRouteControllerDialog
, więc nie musisz nic robić. - W innych przypadkach będziesz tworzyć niestandardowe okna Cast, więc konieczne będzie
wykonaj powyższe instrukcje, by zmienić stan wyboru trasy
MediaRouter
Stan zero urządzeń
Jeśli tworzysz niestandardowe okna przesyłania,
Funkcja MediaRouteChooserDialog
powinna prawidłowo obsługiwać przypadek braku urządzeń
. Okno powinno zawierać wskaźniki jasno wskazujące użytkownikom,
aplikacja nadal próbuje znaleźć urządzenia, ale próba wykrycia zakończy się niepowodzeniem
są dłużej aktywne.
Jeśli używasz domyślnego ustawienia MediaRouteChooserDialog
, stan zero urządzeń
jest już obsługiwany.
Dalsze kroki
To już wszystkie funkcje, które możesz dodać do aplikacji nadawczej na Androida. Teraz możesz utworzyć aplikację nadawczą na inną platformę (iOS lub sieć) albo aplikację odbiorczą internetową.