El tutor de nuestro curso online de Desarrollo de Aplicaciones para Android, Víctor Ramírez Las,…
Android 6.0 Marshmallow: cambios para desarrolladores
2.
Android 6.0 Marshmallow: cambios para desarrolladores
Siguiendo con las novedades más destacadas que nos trae Android 6.0 Marshmallow vamos a ver algunos de los cambios más significativos a la hora de desarrollar Apps para esta nueva versión.
Barra flotante para selección de texto
En Android Marshmallow, al seleccionar texto dentro de una aplicación, aparecerá una barra de herramientas flotante con las opciones de Cortar, Copiar o Pegar. Será de gran similitud a la barra de acción contextual. Puedes ver el proceso en esta imagen animada:
Para poder configurar y hacer uso de este tipo de barra flotante se deberán realizar los siguientes pasos:
- En el objeto
View
oActivity
, cambiar la llamada aActionMode
desdestartActionMode(Callback)
porstartActionMode(Callback, ActionMode.TYPE_FLOATING)
. - La implementación
ActionMode.Callback
deberá extender deActionMode.Callback2
. - Sobrescribir el método
onGetContentRect()
para proporcionar el proveedor de coordenadas del contenido del objetoRect
en la vista (selección de texto en modo rectangular). - Si no es posible el posicionamiento rectangular, y es el único elemento que será inválido, invocar el método
invalidateContentRect()
.
Eliminación del soporte al cliente HTTP
En Android 6.0 se elimina el soporte al cliente HTTP. Desde la documentación oficial de Android, nos recomiendan que si utilizamos el API 9 o superior, implementemos la clase HttpURLConnection
, ya que se trata de una opción más eficiente (menos consumo de energía).
En el supuesto de querer seguir utilizando el cliente HTTP, se deberá añadir como dependencia dentro del archivo build.gradle
:
1 2 3 4 |
android { useLibrary 'org.apache.http.legacy' } |
Validaciones APK
En esta nueva versión de Android, se establecen mayores restricciones a la hora de validar los archivos APK. Este no se declarará válido si uno de sus archivos está presente en el AndroidManifest pero no en el propio APK.
Cambios en Android Keystore
Aunque sigue siendo compatible con ECDSA (Elliptic Curve Digital Signature Algorithm, modificación del algoritmo DSA), Android 6.0 deja de dar soporte a DSA (Digital Signature Algorithm, estándar para firmas digitales).
Cambios en servicio de la cámara
La principal novedad que se aprecia a la hora del acceso a los recursos compartidos de la cámara, es el cambio de filosofía de «first come, first serve» (primero en llegar, primer servido) al modelo de acceso donde se favorecen los procesos de alta prioridad. Este cambio de modelo en Android Marshmallow, permite que se puedan dar los siguientes casos:
- Cuando un cliente tiene activa la cámara en una aplicación de menor prioridad, esta podrá ser expulsada por una app de mayor prioridad (aplicaciones de usuarios visibles o en primer plano).
- Al cambiar del usuario propietario cuando una app utilice la cámara, será expulsado del acceso a dicho soporte.
Cambios en la gestión de permisos
Android 6.0 introduce la gestión de permisos de una aplicación en tiempo de ejecución, o lo que es lo mismo, el usuario podrá asignar permisos a una aplicación una vez que esté ya instalada, pudiendo revocar dichos permisos asignados.
En primer lugar, no estaría mal recordar de que se trata cuando hablamos de permisos del sistema. Cada aplicación que se ejecuta en Android, lo hace desde un entorno limitado, en el que si desea acceder a recursos del sistema o de otra aplicación, necesitará solicitar permisos de manera explícita, y dependiendo del tipo de permiso el sistema lo concederá de manera automática o solicitará al usuario la aprobación de dicha solicitud.
Hasta la versión Marshmallow, todo desarrollo que necesitaba de recursos externos a la aplicación, era necesario declarar los permisos previamente en el AndroidManifest.xml
de la aplicación antes de su instalación y ejecución en el dispositivo. Con esta nueva versión de Android 6.0, será posible declarar permisos de una aplicación en tiempo de ejecución, simplificando en gran medida el proceso de instalación de la aplicación.
Es necesario aclarar que cuando se asignan permisos a una aplicación, es de gran importancia ser conscientes del grado de actuación de ese permiso, ya que es posible declarar permisos de diferente índole:
- Permisos normales: no arriesgan la privacidad del usuario, y será otorgado de manera automática al ser incluido en el
AndroidManifest.xml
. - Permisos peligrosos: pueden permitir el acceso a datos privados del usuario, y el usuario deberá dar de manera explícita el permiso a la aplicación.
En las siguientes líneas, se describirán algunas de las recomendaciones que nos proponen desde la documentación oficial de Android para asignar permisos a una aplicación en tiempo de ejecución:
- Tanto para la declaración de permisos normales, como permisos peligrosos, es necesario tener muy presente la versión dónde se ejecutará nuestra aplicación:
- Si está destinada a la versión 5.1 o inferior (API 22 o inferior), se deberá asignar un permiso peligroso antes de la instalación de la app.
- Si está destinada a la versión 6.0 o superior (API 23 o superior), el usuario deberá asignar los permisos en el
AndroidManifest.xml
, y serán solicitados de manera explícita al usuario en tiempo de ejecución, pudiendo en cualquier momento denegar o conceder nuevos permisos sin que afecte a la ejecución de la aplicación (al resto de operación ajenas a dicho permiso denegado).
- Será imprescindible la comprobación de un permiso peligroso por cada operación que necesite de dicho permiso para ser realizada. Para la realización de dicha comprobación, bastará con incluir las siguientes líneas de código:
12ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);PackageManager.PERMISSION_GRANTED
. En caso de que el permiso solicitado no se haya asignado, el método devolveráPackageManager.PERMISSION_DENIED
- Petición de permisos.Cuando una aplicación necesita de un permiso que no ha sido asignado, bastará con llamar al método
requestPermissions()
para solicitar un determinado permiso. A continuación, la aplicación solicitará los permisos necesarios al usuario junto con un número de petición (en el ejemploMY_PERMISSIONS_REQUEST_READ_CONTACTS
), que de forma asíncrona devolverá el mismo código de petición, una vez el usuario haya respondido al diálogo en pantalla:
1234567891011121314151617181920212223if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){// Should we show an explanation?if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,Manifest.permission.READ_CONTACTS)){/* Aquí se mostrará la explicación al usuario de porqué esnecesario el uso de un determinado permiso, pudiéndose mostrar de manera asíncrona, o lo que es lo mismo, desde unhilo secundario, sin bloquear el hilo principal, y a la espera deque el usuario concede el permiso necesario tras visualizar la explicación.*/}else{/* Se realiza la petición del permiso. En este caso permisospara leer los contactos.*/ActivityCompat.requestPermissions(thisActivity,new String[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);}} - Respuesta a la petición del permiso.Una vez se muestra el diálogo que describe la utilidad del permiso solicitado, el usuario podrá seleccionar si desea dar el permiso o denegarlo, en cualquiera de los dos casos se invocará de manera automática al método
onRequestPermissionsResult()
, que recibirá la respuesta del usuario, y devolverá el acceso o no a los recursos del permiso:
123456789101112131415161718192021222324@Overridepublic void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults){switch (requestCode){case MY_PERMISSIONS_REQUEST_READ_CONTACTS:{//Si la petición es cancelada, el resultado estará vacío.if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED){//Permiso aceptado, se podría acceder a los contactos del dispositivo.} else{//Permiso denegado. Desactivar la funcionalidad que dependía de dicho permiso.}return;}// A continuación, se expondrían otras posibilidades de petición de permisos.}}
Un aspecto de gran importancia cuando hablamos de permisos, es ayudar al usuario a entender por qué necesitamos dicho permiso en la aplicación, sobre todo cuando éste ha rechazado de manera explícita el uso de un determinado permiso pero sigue intentando acceder a la aplicación. Es ahí donde Android nos permite mostrar un breve diálogo sobre el motivo del uso de dicho permiso, aclarando la utilidad del permiso solicitado.
Para ello bastará con utilizar el método
shouldShowRequestPermissionRationale() , que devolverá true
si ya se ha solicitado este permiso y el usuario ha negado su uso. En el supuesto de que el usuario haya indicado con anterioridad Don’t ask again (no preguntar de nuevo), este método devolverá *false
.
Créditos: las imágenes que aparecen en esta publicación están elaboradas por Android Developer y compartidas con Licencia Creative Commons 2.5 Attribution
Esta entrada tiene un comentario
Los comentarios están cerrados.
[…] de su instalación y ejecución en el dispositivo. A partir de la versión Marshmallow, es posible declarar permisos de una aplicación en tiempo de ejecución, simplificando en gran medida el proceso de instalación de la […]