Erweiterte Funktionen zu Android-Apps hinzufügen

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Werbeunterbrechungen

Das Android Sender SDK unterstützt Werbeunterbrechungen und Companion-Anzeigen in einem bestimmten Medienstream.

Weitere Informationen zur Funktionsweise von Werbeunterbrechungen findest du unter Web Receiver-Werbeunterbrechungen.

Sowohl für den Sender als auch den Empfänger können Pausen angegeben werden. Es wird jedoch empfohlen, sie sowohl auf dem Webempfänger als auch auf dem Android TV-Empfänger anzugeben, um ein plattformübergreifendes Verhalten zu gewährleisten.

Unter Android kannst du Werbeunterbrechungen in einem Ladebefehl mit AdBreakClipInfo und AdBreakInfo angeben:

Kotlin
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)
Java
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);

Benutzerdefinierte Aktionen hinzufügen

Eine Absenderanwendung kann MediaIntentReceiver erweitern, um benutzerdefinierte Aktionen zu verarbeiten oder ihr Verhalten zu überschreiben. Wenn Sie Ihre eigene MediaIntentReceiver implementiert haben, müssen Sie sie dem Manifest hinzufügen und den Namen auch in CastMediaOptions festlegen. Dieses Beispiel bietet benutzerdefinierte Aktionen, die die Ein-/Aus-Schaltfläche für die Remote-Medienwiedergabe durch Drücken der Medienschaltfläche und andere Aktionen überschreiben.

// In AndroidManifest.xml
<receiver android:name="com.example.MyMediaIntentReceiver" />
Kotlin
// 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) {
    }
}
Java
// 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) {
    }
}

Benutzerdefinierten Channel hinzufügen

Damit die Absender-App mit der Empfänger-App kommunizieren kann, muss Ihre Anwendung einen benutzerdefinierten Kanal erstellen. Der Absender kann über den benutzerdefinierten Channel Stringnachrichten an den Empfänger senden. Jeder benutzerdefinierte Channel wird durch einen eindeutigen Namespace definiert und muss mit dem Präfix urn:x-cast: beginnen, z. B. urn:x-cast:com.example.custom. Es ist möglich, mehrere benutzerdefinierte Kanäle mit jeweils einem eindeutigen Namespace zu verwenden. Die Empfängeranwendung kann auch Nachrichten mit demselben Namespace senden und empfangen.

Der benutzerdefinierte Channel wird mit der Schnittstelle Cast.MessageReceivedCallback implementiert:

Kotlin
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")
    }
}
Java
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);
    }
}

Sobald die Absender-App mit der Empfänger-App verbunden ist, kann der benutzerdefinierte Kanal mit der Methode setMessageReceivedCallbacks erstellt werden:

Kotlin
try {
    mCastSession.setMessageReceivedCallbacks(
        mHelloWorldChannel.namespace,
        mHelloWorldChannel)
} catch (e: IOException) {
    Log.e(TAG, "Exception while creating channel", e)
}
Java
try {
    mCastSession.setMessageReceivedCallbacks(
            mHelloWorldChannel.getNamespace(),
            mHelloWorldChannel);
} catch (IOException e) {
    Log.e(TAG, "Exception while creating channel", e);
}

Nachdem der benutzerdefinierte Channel erstellt wurde, kann der Absender mit der Methode sendMessage Stringnachrichten über den anderen Kanal an den Empfänger senden:

Kotlin
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)
        }
    }
}
Java
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);
        }
    }
}

Autoplay unterstützen

Weitere Informationen findest du im Abschnitt Autoplay &Wiedergabelisten-APIs.

Bildauswahl für UX-Widgets überschreiben

Verschiedene Komponenten des Frameworks (z. B. das Cast-Dialogfeld, der Minicontroller und der UIMediaController, sofern konfiguriert) zeigen Kunstwerke für das aktuell übertragene Medium an. Die URLs für das Bild-Artwork sind in der Regel im MediaMetadata für die Medien enthalten, die Absender-App kann jedoch eine alternative Quelle für die URLs haben.

Die Klasse ImagePicker definiert ein Mittel zur Auswahl eines geeigneten Bildes aus der Liste von Bildern in einem MediaMetadata basierend auf der Verwendung des Bildes, z. B. Benachrichtigungs-Thumbnail oder Vollbildhintergrund. Bei der Standardimplementierung (ImagePicker) wird immer das erste Bild ausgewählt oder null zurückgegeben, wenn in der MediaMetadata kein Bild verfügbar ist. Die Anwendung kann ImagePicker abgeleitet und die Methode onPickImage(MediaMetadata, ImageHints) überschreiben, um eine alternative Implementierung bereitzustellen. Wählen Sie diese abgeleitete Klasse dann mit der Methode setImagePicker von CastMediaOptions.Builder aus. ImageHints gibt einem ImagePicker Hinweise zu Typ und Größe eines Bilds, das zur Anzeige auf der UI ausgewählt werden kann.

Cast-Dialoge anpassen

SessionManager ist der zentrale Ort für die Verwaltung des Sitzungslebenszyklus. SessionManager überwacht den Android-MediaRouter-Routenauswahlstatus, um Sitzungen zu starten, fortzusetzen und zu beenden. Wenn eine Route ausgewählt wird, erstellt SessionManager ein Session-Objekt und versucht, es zu starten oder fortzusetzen. Wenn die Auswahl einer Route aufgehoben wird, beendet SessionManager die aktuelle Sitzung.

Damit SessionManager die Sitzungslebenszyklen ordnungsgemäß verwaltet, müssen Sie Folgendes beachten:

Je nachdem, wie Sie die Cast-Dialogfelder erstellen, sind möglicherweise weitere Aktionen erforderlich:

Nächste Schritte

Damit sind die Funktionen abgeschlossen, die Sie in Ihrer Android Sender App verwenden können. Sie können jetzt eine Sender-App für eine andere Plattform (iOS oder Web) oder eine Web Receiver App erstellen.