Realiza varias tareas a la vez en la TV

Android 14 (nivel de API 34) introduce algunas mejoras en la APIs de pantalla en pantalla (PIP) que permiten realizar varias tareas a la vez. Mientras que PIP compatibilidad se introdujo en Android 8.0 (nivel de API 26), no fue ampliamente es compatible con Android TV y no es compatible en absoluto con Google TV antes de Android. La función de tareas múltiples para TV usa el modo de PIP para permitir dos que diferentes apps coexistan en la pantalla; una se ejecuta completamente pantalla, con un segundo ejecutándose en modo de PIP. Existen requisitos diferentes para las apps que se ejecutan en cualquiera de estos modos.

El comportamiento predeterminado es que la app de PIP se superpone a la de pantalla completa. Este es similar al comportamiento estándar de pantalla en pantalla de Android.

Ten en cuenta que al integrar la función de tareas múltiples, tu aplicación debe declarar su tipos de uso de conformidad con los lineamientos de calidad de apps para TV.

Cómo ejecutar tu app en modo de PIP

En dispositivos de TV que ejecutan Android 14 (nivel de API 34) o versiones posteriores, ejecuta tu app en PIP. llamando a enterPictureInPictureMode(). Dispositivos de TV que funcionan antes de Android no son compatibles con el modo de PIP.

Este es un ejemplo de cómo implementar la lógica de un botón para ingresar Modo de 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);
    }
}

La acción solo se agrega si el dispositivo tiene la función del sistema. FEATURE_PICTURE_IN_PICTURE Además, cuando se activa la acción, el del modo de PIP se configura para que coincida con la relación de aspecto del video jugó.

Asegúrate de agregar un título y un subtítulo para proporcionarle la información del usuario. sobre el uso general de este PIP.

Coexiste con apps que se ejecutan en modo de PIP

Cuando tu app se ejecuta en pantalla completa, es posible que deba adaptarse a otras apps que se ejecutan en modo de PIP.

APIs de Keep-clear

En algunos casos, la app de PIP puede superponer componentes importantes de la IU dentro del pantalla completa. Para mitigar esto, existen APIs claras que las apps pueden usar para identificar componentes críticos de la interfaz de usuario que no deben superponerse. El sistema intenta respetar las solicitudes para evitar cubrir estos componentes mediante cambiar la posición de la ventana de PIP.

Despejado

Para especificar que una vista no se debe superponer, usa preferKeepClear en tu un diseño XML como en el siguiente ejemplo:

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

También puedes hacerlo de manera programática con 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);
}

Puede haber ocasiones en las que no necesites mantener claro un View completo, pero solo una parte de ella. setPreferKeepClearRects() se puede usar para lo siguiente: especificar las regiones del View que no se deben superponer. IU que no usan View de forma nativa, como Flutter, Jetpack Compose y WebView, podrían tener las subsecciones que necesitan regiones claras. Esta API se puede usar para esos casos.

Tipos de uso

Tu app debe declarar un atributo de valor de metadatos de com.google.android.tv.pip.category, que corresponde al tipo principal o tipos de uso del modo pantalla en pantalla. Cualquier <activity> que se haya establecido android:supportsPictureInPicture="true" debe declarar este atributo con un el valor correspondiente de la tabla que aparece a continuación.

Tipos de uso que no se incluyen en ninguna de estas categorías, en particular reproducción de contenido multimedia, no se permiten en el modo de pantalla en pantalla de la TV

Valor Descripción
"communication" Casos de uso de comunicaciones, como videollamadas o llamadas de voz
"smartHome" Integraciones de casa inteligente, como timbres conectados o monitores para bebés
"health" Casos de uso relacionados con la salud, como monitoreo del estado físico o de la salud.
"ticker" Casos de uso de cotizaciones, como resultados deportivos en vivo o noticias y teletipos de acciones.

Si hay varios valores, se separan con una barra vertical (|). Por ejemplo:

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