Multitasking auf dem Fernseher

Mit Android 14 (API-Level 34) werden einige Verbesserungen an den Bild-im-Bild-APIs (BiB) eingeführt, um Multitasking zu ermöglichen. Die PiP-Unterstützung wurde zwar in Android 8.0 (API-Level 26) eingeführt, wurde aber auf Android TV nicht weitgehend unterstützt und auf Google TV vor Android 13 überhaupt nicht. Beim Multitasking für Fernseher 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 wird die BiB-App über die Vollbild-App gelegt. Das entspricht im Wesentlichen dem Standardverhalten von Android-BiB.

Wenn du Multitasking integrierst, muss deine Anwendung ihre Nutzungstypen gemäß den Qualitätsrichtlinien für TV-Apps deklarieren.

App im PiP-Modus ausführen

Führe deine App auf TV-Geräten mit Android 14 (API-Level 34) oder höher im PiP-Modus aus, indem du enterPictureInPictureMode() aufrufst. TV-Geräte mit älteren Android-Versionen unterstützen den PiP-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 die Systemfunktion FEATURE_PICTURE_IN_PICTURE hat. Wenn die Aktion ausgelöst wird, wird das Seitenverhältnis des BiB-Modus außerdem an das Seitenverhältnis des wiedergegebenen Videos angepasst.

Fügen Sie einen Titel und einen Untertitel hinzu, um dem Nutzer Informationen darüber zu geben, wofür dieses PIP im Allgemeinen verwendet wird.

Koexistenz mit Apps, die im PiP-Modus ausgeführt werden

Wenn deine App im Vollbildmodus ausgeführt wird, muss sie möglicherweise an andere Apps angepasst werden, die im BiB-Modus ausgeführt werden.

Keep-Clear-APIs

In einigen Fällen kann die PiP-App wichtige UI-Komponenten in der Vollbild-App überlagern. Um dies zu vermeiden, 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, um zu vermeiden, dass diese Komponenten durch die Neupositionierung des PiP-Fensters verdeckt werden.

Positionierung des PiP-Fensters, um wichtige UI-Komponenten nicht zu verdecken
Abbildung 1: Positionieren Sie das PiP-Fenster so, dass wichtige UI-Komponenten nicht verdeckt werden.

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

<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, sondern nur einen Teil davon freihalten. Mit setPreferKeepClearRects() können Sie Bereiche des View angeben, die nicht überlagert werden sollen. Benutzeroberflächen, die Views nicht nativ verwenden, z. B. Flutter, Jetpack Compose und WebView, können Unterabschnitte haben, in denen Bereiche freigehalten werden müssen. Diese API kann für diese Fälle verwendet werden.

Nutzungstypen

In deiner App muss ein Metadaten-Wertattribut von com.google.android.tv.pip.category deklariert werden, das dem primären Nutzungstyp oder den primären Nutzungstypen für den Bild-im-Bild-Modus entspricht. Jedes <activity>, für das android:supportsPictureInPicture="true" festgelegt ist, sollte dieses Attribut mit einem relevanten Wert aus der folgenden Tabelle deklarieren.

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

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

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

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