Hace unos días recibí la enésima comunicación desde Google, en este caso por una aplicación Android. Podría resumirse como sigue, aunque todos los emails de Google son muy parecidos.
Querido desarrollador de Android:
¡Déjalo todo, tenemos preferencia... Somos Google! En nuestra infinita sabiduría, hemos decidido que el que tu cotrosa aplicación permita abrir un diálogo de apertura de archivo para tan solo abrir una imagen es una vulgaridad, por no decir una barbaridad, así que lo hemos declarado obsoleto.
Y es que, ese permiso de READ_MEDIA, que te permitiría explorar el contenido multimedia... tsk, tsk... muy peligroso. Obsoleto también.
Es importante que tengas en cuenta que hemos abierto un plazo para que a vuestras aplicacioncillas les dé tiempo a actualizarse, utilizando la nueva API. Desgraciadamente, el plazo expiró ayer, aunque puedes aplicar para pedir una extensión del plazo.
Uno de nuestros equipos había preparado una nueva API de compatibilidad, de forma que la migración fuese lo menos dificultosa posible, pero cuando lo terminamos nos dimos cuenta de que debíamos declararlo obsoleto.Que te den,
Google.
Hasta ahora, la forma de abrir un diálogo con Android era así:
final ActivityResultLauncher<String> LAUNCH_PICKER =
this.registerForActivityResult(
new ActivityResultContracts.GetContent(),
uri -> {
if ( uri != null ) {
// Haz algo con la URI
}
});
Y se llamaba así:
String intentTypeStr = "image/*";
this.LAUNCH_PICKER.launch( intentTypeStr );
Es decir, añades un filtro utilizando el tipo MIME para imágenes (utilizarías otro filtro similar para vídeos), creas el selector y lo lanzas. La cosa no tiene más importancia; no da para más.
Y ahora, tienes que hacerlo de esta otra forma:
ActivityResultLauncher<PickVisualMediaRequest> pickMedia =
this.registerForActivityResult(new PickVisualMedia(), uri -> {
if ( uri != null ) {
// Haz algo con la URI
}
});
Y se lanzará así:
pickMedia.launch(new PickVisualMediaRequest.Builder()
.setMediaType(PickVisualMedia.ImageOnly.INSTANCE)
.build());
Puedo comprender que dejar en manos del programador el filtrar los archivos pueda suponer algún problema de seguridad, pero también tenemos que tener en cuenta las distintas capas de seguridad que se han ido incorporando a lo largo de los años: al principio los archivos podían abrirse simplemente creando un objeto File
que apuntase al almacenamiento (permitiendo incluso navegar por directorios), mientras que ya con Android 7 se estableció que sólo se podrían abrir URIs desde el mísmo, y que esas URIs tendrían que estar sancionadas previamente mediante lo que se conoce como un ContentProvider
. Y no olvidemos que le estás ofreciendo al usuario que haga algo él o ella, intencionalmente: ¡escoger un archivo!
Pero la cosa va a mejor. Si nos fijamos en la entrada del blog de Android donde dan a conocer la disponibilidad de fotos en la nube para el media picker, resulta que el soporte ha de ser explícito, es decir, el resto de servicios en la nube que quieran que el usuario pueda escoger una foto o un vídeo de su servidor, tendrán que implementar esta posbilidad, en lugar de ser soportado automáticamente por Google.
Y es que ahí está mi mayor "pero". En realidad, Google no está más que añadiendo una API alternativa, nueva, con funcionalidad que al fin y al cabo ya existía, cuando sería mucho más sencillo que en la antigua API existiera algo así como:
if ( filter == MIME_IMAGES
| filter == MIME_VIDEOS )
{
pickMedia.launch(
new PickVisualMediaRequest.Builder()
.setMediaType( PickVisualMedia.
ImageOnly.
INSTANCE )
.build());
}
...haciendo la transición mucho más sencilla para todos, y cambiando la documentación para utilizar la nueva API directamente.
Pero entonces ya no sería Google. La compañía ha demostrado siempre el mayor desprecio por los desarrolladores, declarando obsoletas APIs que hasta ese momento aparecían recomendadas en la documentación, como por ejemplo AsyncTask, que tomó a todo el mundo por sorpresa.
Y suma y sigue. En fin, qué se le va a hacer.
Top comments (0)