API para el resultado de la actividad de AndroidX: captura de fotos de Sean Ashmore | Octubre de 2020

Adiós startActivityForResult ()

Una foto de Samuel Bryngelsson en Unsplash

Desde AndroidX Activity 1.2.0-alpha02 y Fragment 1.3.0-alpha02, los desarrolladores de Android tienen un nuevo mecanismo para solicitar resultados de una actividad o fragmento.

En lugar de llamar a startActivityForResult () con el código de solicitud y escuchar los resultados potenciales en onActivityResult (), ahora simplemente usamos un contrato que define nuestras entradas y salidas y cómo queremos procesar las salidas cuando llegan.

Podemos definir nuestros propios contratos, aunque afortunadamente, se preparan algunos escenarios comunes «listos para usar». En este artículo, quería abordar la tarea común de permitir a sus usuarios tomar fotografías con su cámara.

Como siempre, podemos (y debemos) verificar si un permiso específico está habilitado actualmente antes de intentar tomar una acción que lo requiera. En nuestro caso, queremos acceder a la cámara y podemos comprobar los permisos de la siguiente manera:

Siempre que no se otorgue esta autorización, simplemente podemos solicitarla utilizando el acuerdo RequestPermission.

Primero, cree un ActivityResultLauncher que podamos usar para iniciar nuestra solicitud de permiso:

Luego, simplemente ejecute la solicitud con el permiso requerido, como este:

El acuerdo RequestPermission que usamos anteriormente significa que nuestro método de ejecución tomará un solo permiso como entrada. Esto cambiará según el contrato que elija utilizar, como verá a continuación.

La devolución de llamada que definió anteriormente se activará cuando el usuario permita / deniegue su solicitud de permiso y podrá procesar su respuesta en consecuencia.

Un escenario más realista implicaría solicitar más permisos, porque en el ejemplo de la cámara anterior, es más probable que desee obtener la imagen que tomó el usuario y hacer algo al respecto.

La forma normal de hacer esto es crear un archivo y proporcionarlo a la aplicación de la cámara en la que se guarda la imagen, pero esto requiere la capacidad de escribir en el almacenamiento y se puede incorporar muy fácilmente en el código existente anterior con algunos cambios menores.

Actualice la creación de su ActivityResultLauncher cambiando:

en

Ahora estamos usando otro acuerdo predefinido que espera requerir uno o más permisos y, en lugar de uno booleano, devuelve un mapa de permisos al resultado booleano.

Su devolución de llamada también deberá actualizarse para adaptarse a esto y debería verse así:

Ahora podemos determinar si el usuario ha concedido o denegado cada uno de los permisos que hemos solicitado de forma individual.

Ahora comienza con algo como esto:

Tenga en cuenta que ahora que estamos usando un contrato diferente, nuestros parámetros de ejecución han cambiado y el contrato RequestMultiplePermissions espera 1 o más permisos como entrada de campo.

Una vez que el usuario ha otorgado ambos permisos, podemos crear un nuevo archivo para guardar cualquier imagen capturada y ejecutar nuestra solicitud para que el usuario capture la imagen.

Cree un archivo haciendo algo similar y guarde la ruta actual para su uso posterior:

Obtenga el URI del contenido que su archivo debe proporcionar a la aplicación de la cámara utilizando un proveedor de archivos:

Cree otro ActivityResultLauncher utilizando un contrato «TakePicture» prediseñado.

Finalmente, el contrato TakePicture () espera el Uri como entrada, por lo que ejecuta su solicitud y la pasa al archivo Uri que creó para guardar la imagen.

Para leer más sobre todo esto, consulte la documentación para desarrolladores de Android en: https://developer.android.com/training/basics/intents/result

Para ver más contratos disponibles listos para usar, consulte lo siguiente: https://developer.android.com/reference/androidx/activity/result/contract/ActivityResultContracts

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *