Multitasking auf dem Fernseher

Android 14 (API‑Level 34) führt einige Verbesserungen an den APIs für den Bild-im-Bild-Modus ein, um Multitasking zu ermöglichen. Die Unterstützung für den BiB-Modus wurde in Android 8.0 (API-Level 26) eingeführt, war aber auf Android TV nicht weit verbreitet und vor Android 13 auf Google TV überhaupt nicht unterstützt. Beim Multitasking für TV wird der BiB-Modus verwendet, damit zwei separate Apps gleichzeitig auf dem Bildschirm angezeigt werden können: eine im Vollbildmodus und eine im BiB-Modus. Für Apps, die in einem dieser Modi ausgeführt werden, gelten unterschiedliche Anforderungen.

Standardmäßig überlagert die Bild-im-Bild-App die Vollbild-App. Das entspricht dem Standardverhalten des Bild-im-Bild-Modus unter Android.

Wenn Sie Multitasking einbinden, muss Ihre Anwendung ihre Nutzungstypen gemäß den Qualitätsrichtlinien für TV-Apps deklarieren.

App im Bild-im-Bild-Modus ausführen

Auf TV-Geräten mit Android 14 (API‑Level 34) oder höher können Sie Ihre App im Bild-im-Bild Modus ausführen, indem Sie enterPictureInPictureMode() aufrufen. TV-Geräte mit älteren Android-Versionen unterstützen den Bild-im-Bild-Modus nicht.

Hier ist ein Beispiel für die Implementierung der Logik einer Schaltfläche zum Aufrufen des Bild-im-Bild-Modus:

Kotlin

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    pictureInPictureButton.visibility =
        if (requireActivity().packageManager.hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
            pictureInPictureButton.setOnClickListener {
                val aspectRatio = Rational(view.width, view.height)
                val params = PictureInPictureParams.Builder()
                    .setAspectRatio(aspectRatio)
                    .build()
                val result = requireActivity().enterPictureInPictureMode(params)
            }
            View.VISIBLE
        } else {
            View.GONE
        }
}

Java

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (requireActivity().getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE)) {
        pictureInPictureButton.setVisibility(View.VISIBLE);
        pictureInPictureButton.setOnClickListener(v -> {
            Rational aspectRatio = new Rational(view.getWidth(), view.getHeight());
            PictureInPictureParams params = new PictureInPictureParams.Builder()
                    .setAspectRatio(aspectRatio)
                    .setTitle("My Streaming App")
                    .setSubtitle("My On-Demand Content")
                    .build();
            Boolean result = requireActivity().enterPictureInPictureMode(params);
        });
    } else {
        pictureInPictureButton.setVisibility(View.GONE);
    }
}

Die Aktion wird nur hinzugefügt, wenn das Gerät das Systemfeature FEATURE_PICTURE_IN_PICTURE hat. Wenn die Aktion ausgelöst wird, wird das Seitenverhältnis des Bild-im-Bild-Modus außerdem so festgelegt, dass es dem Seitenverhältnis des wiedergegebenen Videos entspricht.

Fügen Sie einen Titel und einen Untertitel hinzu, um dem Nutzer Informationen zur allgemeinen Verwendung des Bild-im-Bild-Modus zu geben.

Mit Apps im Bild-im-Bild-Modus zusammenarbeiten

Wenn Ihre App als Vollbild-App ausgeführt wird, muss sie möglicherweise an andere Apps angepasst werden, die im Bild-im-Bild-Modus ausgeführt werden.

Keep-clear-APIs

In einigen Fällen kann die Bild-im-Bild-App wichtige UI-Komponenten in der Vollbild-App überlagern. Um dies zu verhindern, gibt es Keep-clear-APIs, mit denen Apps kritische UI-Komponenten identifizieren können, die nicht überlagert werden sollen. Das System versucht, die Anfragen zu berücksichtigen und diese Komponenten nicht zu verdecken, indem es das Bild-im-Bild-Fenster neu positioniert.

Keep-Clear

Wenn Sie angeben möchten, dass eine Ansicht nicht überlagert werden soll, verwenden Sie preferKeepClear in Ihrem XML-Layout, wie im folgenden Beispiel:

<TextView
    android:id="@+id/important_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:preferKeepClear="true"
    android:text="@string/app_name"/>

Sie können dies auch programmatisch mit setPreferKeepClear() tun:

Kotlin

private lateinit var binding: MyLayoutBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    binding = MyLayoutBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.importantText.isPreferKeepClear = true
}

Java

private MyLayoutBinding binding;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    binding = MyLayoutBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    binding.importantText.setPreferKeepClear(true);
}

Manchmal müssen Sie nicht die gesamte View freihalten, sondern nur einen Teil davon. Die setPreferKeepClearRects() kann verwendet werden, um Bereiche der View anzugeben, die nicht überlagert werden sollen. Bei UIs, die keine nativen Views verwenden, z. B. Flutter, Jetpack Compose und WebView, müssen möglicherweise Unterbereiche freigehalten werden. In diesen Fällen kann diese API verwendet werden.

Nutzungstypen

Ihre App muss ein Meta-Datenattribut vom Typ com.google.android.tv.pip.category deklarieren, das dem primären Nutzungstyp oder den primären Nutzungstypen für den Bild-im-Bild-Modus entspricht. Jede <activity>, für die android:supportsPictureInPicture="true" festgelegt ist, muss dieses Attribut mit einem relevanten Wert aus der folgenden Tabelle deklarieren.

Nutzungstypen, die nicht in eine dieser Kategorien fallen, insbesondere die Wiedergabe von Medieninhalten, sind im Bild-im-Bild-Modus auf dem Fernseher nicht zulässig.

Wert Beschreibung
"communication" Anwendungsfälle für die Kommunikation, z. B. Video- oder Sprachanrufe.
"smartHome" Smart-Home-Integrationen, z. B. verbundene Türklingeln oder Babyphones.
"health" Anwendungsfälle im Gesundheitsbereich, z. B. Fitness-Tracking oder Gesundheitsüberwachung.
"ticker" Anwendungsfälle für Ticker, z. B. Live-Sportergebnisse oder Nachrichten- und Börsenticker.

Mehrere Werte werden durch einen senkrechten Strich (|) getrennt. Beispiel:

<meta-data android:name="com.google.android.tv.pip.category" android:value="smartHome|health" />