Multitasking auf dem Fernseher

Mit Android 14 (API-Level 34) wurden einige Verbesserungen Bild im Bild (BiB) APIs für Multitasking Während BiB in Android 8.0 (API-Level 26) eingeführt, unterstützt auf Android TV. Vor Android wurde auf Google TV noch nichts unterstützt. 13. 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. Es gibt unterschiedliche Anforderungen für Apps, die in einem dieser Modi ausgeführt werden.

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.

Beachte, dass bei der Integration von Multitasking in deiner App seine Nutzungstypen in den Qualitätsrichtlinien für TV-Apps entsprechen.

App im BiB-Modus ausführen

Auf Fernsehern mit Android 14 (API-Level 34) oder höher: App in BiB 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 BiB-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 hat FEATURE_PICTURE_IN_PICTURE 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 als Vollbild-App ausgeführt wird, muss sie möglicherweise an andere Apps, die im BiB-Modus ausgeführt werden.

Klare APIs

In einigen Fällen kann die BiB-App wichtige UI-Komponenten innerhalb des Vollbild-App hinzu. Um dies zu verhindern, gibt es klare APIs, die Apps um kritische UI-Komponenten zu identifizieren, die nicht eingeblendet werden sollten. Das System die Anforderungen zu berücksichtigen, um die Abdeckung dieser Komponenten zu vermeiden, Neupositionierung des BiB-Fensters.

Klarer Zugriff

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

Es kann vorkommen, dass Sie nicht den gesamten View leer halten müssen, aber nur einen Teil davon. Mit der setPreferKeepClearRects() können Sie Folgendes tun: Geben Sie Regionen von View an, die nicht eingeblendet werden sollen. Benutzeroberflächen, die nicht View wie Flutter, Jetpack Compose und WebView für Unterbereiche, die Regionen frei halten müssen. Diese API kann in diesen Fällen verwendet werden.

Nutzungstypen

In Ihrer App muss ein Meta-Datenwertattribut wie folgt deklariert werden: com.google.android.tv.pip.category, das dem primären Typ entspricht, oder Verwendungsmöglichkeiten für den Bild-im-Bild-Modus. Alle <activity>, die Folgendes festgelegt haben: android:supportsPictureInPicture="true" sollte dieses Attribut mit einem relevanten Wert aus der Tabelle unten.

Nutzungstypen, die in keine dieser Kategorien fallen, insbesondere Wiedergabe von Medieninhalten sind im Bild-im-Bild-Modus auf Fernsehern nicht erlaubt.

Wert Beschreibung
communication Kommunikationsanwendungsfälle wie Video- oder Sprachanrufe
smartHome Smart-Home-Integrationen wie verbundene Türklingeln oder Babyfone
health Gesundheitsbezogene Anwendungsfälle wie Fitness-Tracking oder Gesundheitsüberwachung
ticker Ticker-Anwendungsfälle wie Live-Sportergebnisse oder Nachrichten und Börsenticker.

Mehrere Werte werden durch einen vertikalen Strich (|) getrennt. Hier einige Beispiele:

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