Le multitâche sur un téléviseur

Android 14 (niveau d'API 34) introduit quelques améliorations Picture-in-picture (PIP) pour permettre le multitâche. Tandis que le PIP prise en charge depuis Android 8.0 (niveau d'API 26), compatible avec Android TV, mais pas avec Google TV avant Android 13. Le mode multitâche sur téléviseur utilise le mode PIP pour autoriser deux des applications distinctes pour coexister à l'écran: l'une s'exécute en plein écran. avec une deuxième exécution en mode PIP. Il y a des exigences différentes pour les applications s'exécutant dans l'un ou l'autre de ces modes.

Par défaut, l'application PIP se superpose à l'application plein écran. C'est semblable à celui d'Android Picture-in-picture standard.

Notez que lors de l'intégration du mode multitâche, votre application doit déclarer son types d'utilisation conformément aux consignes relatives à la qualité des applis TV.

Exécuter votre application en mode PIP

Pour les téléviseurs équipés d'Android 14 (niveau d'API 34) ou version ultérieure, exécutez votre application en mode PIP. en appelant enterPictureInPictureMode(). Appareils TV fonctionnant plus tôt versions d'Android ne sont pas compatibles avec le mode PIP.

Voici un exemple d'implémentation de la logique d'un bouton permettant d'entrer Mode PIP:

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

L'action n'est ajoutée que si l'appareil dispose de la fonctionnalité système FEATURE_PICTURE_IN_PICTURE Par ailleurs, lorsque l'action est déclenchée, Le format du mode PIP est configuré pour correspondre au format de la vidéo en cours de lecture. joué.

Veillez à ajouter un titre et un sous-titre pour donner des informations à l'utilisateur. sur ce à quoi cette PIP est généralement utilisée.

Coexister avec des applications s'exécutant en mode PIP

Lorsque votre application s'exécute en plein écran, elle peut avoir besoin de s'adapter à d'autres des applications s'exécutant en mode PIP.

API de clarté

Dans certains cas, l'application PIP peut superposer d'importants composants d'interface utilisateur dans plein écran. Pour atténuer ce problème, il existe des API claires que les applications peuvent utiliser pour identifier les composants d'UI critiques qui ne doivent pas être superposés. Le système s'efforce d'honorer les demandes afin d'éviter de couvrir ces composants en repositionnant la fenêtre PIP.

Restez à l'écart

Pour spécifier qu'une vue ne doit pas être superposée, utilisez preferKeepClear dans votre Mise en page XML comme dans l'exemple suivant:

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

Vous pouvez également effectuer cette opération par programmation à l'aide de setPreferKeepClear():

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

Il peut arriver que vous n'ayez pas besoin de garder une View entièrement claire, mais n'en contient qu'une partie. Le setPreferKeepClearRects() peut être utilisé pour spécifier des régions du View qui ne doivent pas être superposées. Les interfaces utilisateur qui n'utilisent pas Les Views en mode natif, tels que Flutter, Jetpack Compose et WebView, peuvent avoir sous-sections qui nécessitent que les régions restent claires. Cette API peut être utilisée dans ce cas.

Types d'utilisation

Votre application doit déclarer un attribut de valeur de métadonnées correspondant à com.google.android.tv.pip.category correspondant au type ou au types d'utilisation du mode Picture-in-picture. Tout <activity> défini android:supportsPictureInPicture="true" doit déclarer cet attribut avec un la valeur la plus pertinente dans le tableau ci-dessous.

Types d'utilisation qui n'appartiennent à aucune de ces catégories, en particulier aucune la lecture de contenus multimédias, ne sont pas autorisées en mode Picture-in-picture sur les téléviseurs.

Valeur Description
"communication" Cas d'utilisation pour les communications, comme les appels vidéo ou vocaux.
"smartHome" Des intégrations pour la maison connectée, comme les sonnettes connectées ou les babyphones
"health" Cas d'utilisation pour la santé, comme le suivi de l'activité physique ou de la santé.
"ticker" Cas d'utilisation d'indices, comme les résultats sportifs en direct, les actualités et les valeurs boursières.

Les valeurs multiples sont séparées par une barre verticale (|). Par exemple:

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