Multitasking auf dem Fernseher

Android 14 (API-Level 34) führt einige Verbesserungen an den Bild-im-Bild-APIs (PiP) ein, um Multitasking zu ermöglichen. Die Unterstützung von PiP wurde zwar in Android 8.0 (API-Ebene 26) eingeführt, aber nicht umfassend auf Android TV unterstützt und vor Android 13 überhaupt nicht auf Google TV. Beim Multitasking auf dem Fernseher wird im BiB-Modus separate Apps auf dem Bildschirm nebeneinander, wobei eine vollständig ausgeführt wird ein zweites Mal im BiB-Modus. Für Apps, die in einem dieser Modi ausgeführt werden, gelten unterschiedliche Anforderungen.

Das Standardverhalten ist, dass die BiB-App über die Vollbild-App gelegt wird. Dies ist Das funktioniert ähnlich wie das standardmäßige Bild-im-Bild-Verhalten in Android.

Wenn Sie Multitasking einbinden, müssen Sie die Nutzungsarten Ihrer Anwendung gemäß den Qualitätsrichtlinien für TV-Apps angeben.

App im PiP-Modus ausführen

Auf Fernsehern mit Android 14 (API-Level 34) oder höher können Sie Ihre App im PiP-Modus ausführen, indem Sie enterPictureInPictureMode() aufrufen. Ältere Fernsehgeräte wird von Android-Versionen im BiB-Modus nicht unterstützt.

Hier ist ein Beispiel für die Implementierung der Logik einer Schaltfläche, mit der der PiP-Modus aktiviert wird:

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, Das Seitenverhältnis des BiB-Modus ist auf das Seitenverhältnis des Videos festgelegt, das gerade wiedergegeben wird. gespielt haben.

Vergessen Sie nicht, einen Titel und einen Untertitel hinzuzufügen, um dem Nutzer Informationen zu liefern. wofür diese BiB im Allgemeinen verwendet wird.

Gleichzeitige Verwendung mit Apps, die im BiB-Modus ausgeführt werden

Wenn Ihre App im Vollbildmodus ausgeführt wird, muss sie sich möglicherweise an andere Apps anpassen, die im PiP-Modus ausgeführt werden.

Klare APIs

In einigen Fällen kann die PiP-App wichtige UI-Komponenten in der Vollbild-App überlagern. Um dies zu vermeiden, gibt es APIs, mit denen Apps kritische UI-Komponenten identifizieren können, die nicht überlagert werden sollten. Das System die Anforderungen zu berücksichtigen, um die Abdeckung dieser Komponenten zu vermeiden, Neupositionierung des BiB-Fensters.

Keep-Clear

Um anzugeben, dass eine Ansicht nicht eingeblendet 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 mithilfe von 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 den gesamten View freihalten, sondern nur einen Teil davon. Mit dem setPreferKeepClearRects() können Sie Folgendes tun: Geben Sie Regionen von View an, die nicht eingeblendet werden sollen. UIs, die View nicht nativ verwenden, z. B. Flutter, Jetpack Compose und WebView, können Unterabschnitte haben, in denen Bereiche frei bleiben müssen. Diese API kann in diesen Fällen verwendet werden.

Nutzungstypen

Ihre App muss ein Metadatenwertattribut von com.google.android.tv.pip.category deklarieren, das dem primären oder den primären Verwendungstypen für den Bild-in-Bild-Modus entspricht. Für alle <activity>, für die android:supportsPictureInPicture="true" festgelegt ist, muss dieses Attribut mit einem relevanten Wert aus der folgenden Tabelle deklariert werden.

Nutzungsarten, die in keine 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 wie verbundene Türklingeln oder Babyfone
health Gesundheitsbezogene Anwendungsfälle wie Fitness-Tracking oder Gesundheitsüberwachung
ticker Anwendungsfälle für Ticker, z. B. Live-Sportergebnisse oder Nachrichten- und Aktienticker.

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

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