Permisos definidos por el usuario en Android

Además de los permisos definidos por el sistema, los desarrolladores vamos a poder crear nuevos permisos para restringir el acceso a elementos de nuestro software.

Puedes ver algunos aspectos relacionados en formato poli[Media]

Permisos definidos por el usuario en Android

Abordaremos el estudio de la creación de nuevos permisos utilizando el siguiente ejemplo. Somos la empresa PayPerView especializada en ofrecer servicios de reproducción de vídeos bajo demanda. Queremos crear un software que permita a cualquier desarrollador reproducir nuestros vídeos desde sus aplicaciones. No obstante, este servicio no es gratuito, por lo que nos interesa que el usuario sea advertido cuando se instale la aplicación del tercero, indicándole que esta aplicación va hacer uso de un servicio no gratuito.

Para definir el nuevo permiso utilizaremos el tag <permission> en el ficheroAndroidManifest.xml de nuestro software. A continuación se muestra un ejemplo:

<permission
      android:name="com.payperview.servicios.VER_VIDEOS"
      android:description="@string/descripcion"
      android:label="@string/etiqueta"
      android:permissionGroup="android.permission-group.COST_MONEY"
      android:protectionLevel="dangerous" />

El atributo android:name indica el nombre del permiso. Como ves ha de estar dentro del mismo dominio que nuestra aplicación. El atributo android:permissionGroup es opcional y permite incluir nuestro permiso en un grupo. En el ejemplo se ha incluido en el grupo de permisos que pueden suponer un coste económico al usuario. El atributo android:protectionLevelinforma al sistema cómo el usuario ha de ser informado y qué aplicaciones tienen acceso al permiso. Los valores posibles se indican a continuación:

 

normal  El usuario no es advertido de que se va utilizar el permiso.
dangerous El usuario es advertido.
signature Solo aplicaciones firmadas con la misma firma digital que la aplicación que declara el permiso
signatureOrSystem Igual que signature pero además puede ser usado por el sistema. Caso poco frecuente donde varios fabricantes necesitan compartir características a través de la imagen del sistema.

Los atributos android:label y android:description son opcionales y han de ser introducidos a través de un recurso de cadena. En estas cadenas hay que describir el permiso de forma abreviada y extensa, respectivamente. Veamos cómo podría ser en el ejemplo:

<string name="etiqueta">
   reproducción de videos bajo demanda </string>
<string name="descripcion">Permite a la aplicación reproducir 
   videos de la empresa PayPerView sin tu intervención. Se trata 
   de un servicio no gratuito, por lo que puede afectar al saldo 
   de tu cuenta con esta empresa. Si no tienes una cuenta 
   abierta los videos no podrán ser reproducidos. </string>

Ejercicio paso a paso: Creando tus propios permisos.

 

Vamos a comprobar cómo usar este permiso con este ejercicio:

1.     Crea un nuevo proyecto con los siguientes datos:

 

Project Name: NuevoPermiso

Package Name: com.payperview.servicios

Min SDK Version: 3

2.     Crea una nueva actividad en este proyecto con nombre VerVideo y copia el mismo código de la actividad principal. En el ejemplo real esta nueva actividad sería la responsable de la reproducción de vídeos.

3.  En lugar de visualizar un vídeo vamos a poner un toast. Añade en el método onCreate el siguiente código:

Toast.makeText(this, "Reproduciendo Vídeo", Toast.LENGTH_SHORT).show();

La aplicación NuevoPermiso va a tener dos actividades: MainActivity y VerVideo. Realmente estas actividades no hacen nada, se limitan a poner "hello word". La actividad  VerVideo es la que reproduciría los videos y la que queremos proteger con un permiso. La actividad MainActivity no sirve para nada pero es para que la aplicación tenga una actividad inicial.

4.     Modifica el fichero AndroidManifest.xml según el código mostrado a continuación:

<manifest…>
       <application…>
             …
             <activity 
                    android:name="VerVideo"
                    android:permission= "com.payperview.servicios.VER_VIDEOS">
                    <intent-filter>
                           <action android:name="android.intent.action.VIEW" />
                    </intent-filter>
             </activity>
       </application>
</manifest>

5.     Copia delante de <application…/> la etiqueta <permission …/> del ejemplo anterior.

6.     Recuerda definir los recursos de cadena etiqueta y descripcion, tal y como se indica en el ejemplo anterior.

7.     Ejecuta el proyecto. Es imprescindible para registrar en el teléfono el nuevo permiso y la nueva actividad que queremos lanzar desde otras aplicaciones.

8.     Para usar este servicio crea un nuevo proyecto con los siguientes datos:

Project Name: UsarPermiso

Package Name: org.example.usarpermiso

9.     Abre el fichero del layout principal (activity_main.xml) y reemplaza el código por el siguiente:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:onClick="verVideo"
        android:text="Ver Vídeo" />
</LinearLayout>

10.  Abre la actividad principal y añade el siguiente método:

public void verVideo (View view){
        Intent i = new Intent();
        i.setClassName("com.payperview.servicios",
                         "com.payperview.servicios.VerVideo");
        startActivity(i);
    }

11.  Ejecuta la aplicación. Cuando pulses el botón la aplicación provocará un error.

12.  Visualiza la ventana LogCat para verificar que se trata de un error de permiso. Ha de aparecer algo parecido a:

13.  Para solucionar el problema tendrás que incluir el siguiente código al principio del fichero AndroidManifest.xml:         

<uses-permission android:name="com.payperview.servicios.VER_VIDEOS"/>

14.  Comprueba cómo ahora se accede al servicio sin problemas.

15.  En este ejercicio hemos puesto el nivel de protección del permiso como dangerous. No obstante, si la aplicación es instalada desde Eclipse no se nos advierte sobre este permiso.Para que si lo advierta, tenemos que instalar la aplicación manualmente.

Para ello, con un administrador de archivo, abre la carpeta bin del proyecto y copia el ficheroUsarPermiso.apk a la memoria externa del dispositivo. Instala la aplicación. Verás como aparece un mensaje similar al siguiente:

Preguntas de repaso y reflexión:

Pincha aquí para hacer un test.