
A los usuarios les encantan las imágenes, los videos y demás contenido expresivo, pero insertar y mover este contenido en apps no siempre es fácil. Para que tus apps puedan recibir contenido enriquecido de manera simple, incorporamos una nueva API unificada que te permitirá aceptar contenido de cualquier fuente: portapapeles, teclado o mediante la función de arrastrar y soltar.
Puedes adjuntar una nueva interfaz, OnReceiveContentListener
, a los componentes de la IU y obtener una devolución de llamada cuando se inserta contenido a través de cualquier mecanismo. La devolución de llamada se convierte en el único lugar para que tu código controle la recepción de todo el contenido, desde texto sin formato y estilo hasta lenguaje de marcado, imágenes, videos, archivos de audio y otros elementos.
Para retrocompatibilidad con versiones de Android, agregamos la nueva API a AndroidX (disponible en Core 1.5.0-beta1 y Appcompat 1.3.0-beta-01), que te recomendamos que uses cuando implementes esta función.
Descripción general
Con las API existentes, cada mecanismo de IU (como el menú de presión prolongada, o la función de arrastrar y soltar) tiene su propia API correspondiente. Eso significa que debes realizar la integración con cada API por separado, lo que agrega código similar para cada mecanismo que inserte contenido:
La API unificada consolida estas rutas de código diferentes creando una sola API para que puedas enfocarte en la lógica específica de tu app y permitir que la plataforma controle el resto:
Este enfoque también significa que, cuando se agregan nuevas formas de insertar contenido en la plataforma, no necesitas hacer cambios adicionales de código para habilitar la compatibilidad en tu app. Si necesitas que tu app implemente la personalización completa para un caso de uso en particular, puedes usar las API existentes, que continuarán funcionando de la misma manera.
Implementación
La API nueva es una interfaz de objeto de escucha con un único método, OnReceiveContentListener
.
Para admitir versiones anteriores de la plataforma de Android, recomendamos el uso de la interfaz OnReceiveContentListener
coincidente en la biblioteca de AndroidX Core.
Para usar la API, comienza a implementar el objeto de escucha mediante la especificación de los tipos de contenido que tu app puede controlar:
public class MyReceiver implements OnReceiveContentListener {
public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};
// ...
Después de especificar todos los tipos de MIME de contenido que admite tu app, implementa el resto del objeto de escucha:
public class MyReceiver implements OnReceiveContentListener {
public static final String[] MIME_TYPES = new String[] {"image/*", "video/*"};
@Override
public ContentInfoCompat onReceiveContent(View view, ContentInfoCompat contentInfo) {
Pair<ContentInfoCompat, ContentInfoCompat> split = contentInfo.partition(
item -> item.getUri() != null);
ContentInfo uriContent = split.first;
ContentInfo remaining = split.second;
if (uriContent != null) {
ClipData clip = uriContent.getClip();
for (int i = 0; i < clip.getItemCount(); i++) {
Uri uri = clip.getItemAt(i).getUri();
// App-specific logic to handle the URI ...
}
}
// Return anything that your app didn't handle. This preserves the default platform
// behavior for text and anything else that you aren't implementing custom handling for.
return remaining;
}
}
Si tu app ya admite el uso compartido con intents, puedes volver a usar la lógica específica de la app para administrar los URI de contenido. Muestra los datos restantes para delegar su control a la plataforma.
Después de implementar el objeto de escucha, configúralo en el constructor del elemento de IU de tu app:
public class MyActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
// ...
AppCompatEditText myInput = findViewById(R.id.my_input);
ViewCompat.setOnReceiveContentListener(myInput, MyReceiver.MIME_TYPES, new MyReceiver());
}
}
Comparación con la API de imagen de teclado
Puedes considerar la API de contenido unificado como la próxima versión de la API de imagen de teclado existente. La nueva API admite la funcionalidad de la API de imagen de teclado y algunas características adicionales:
Acción o función | Compatible con la API de imágenes de teclado | Compatible con la API unificada |
---|---|---|
Insertar desde el teclado | Sí (nivel de API 24 y versiones posteriores) | Sí (nivel de API 24 y versiones posteriores) |
Insertar con la opción para pegar desde el menú de presión prolongada | No | Sí |
Insertar con la función de arrastrar y soltar | No | Sí (nivel de API 24 y versiones posteriores) |