Hace algún tiempo nos surgió la necesidad de crear una comunicación segura de información entre dos aplicaciones en un dispositivo Android y dado que uno de los requisitos era que lo controlara el propio sistema operativo, y tras una búsqueda para ver las posibilidades que había decidimos usar un permiso en el AndroidManifest.xml asignándole un nivel de protección, el interesante para esto es el android:protectionLevel, que identifica y avisa al usuario a la hora de instalar la aplicación del riesgo del permiso, además de determinar el procedimiento que tiene que seguir el sistema a la hora de tratar la aplicación.
<permission android:name="permissionName” android:protectionLevel="levelofprotection">
Niveles de protección
Hay cuatro tipos de niveles de protección:
- Normal: es el que tienen los permisos asignados por defecto, no supone un riesgo para el sistema ni para el usuario ya que el permiso que tenga asignado este nivel sólo va a poder acceder a recursos de la propia aplicación, como no suponen un riesgo, el sistema da acceso por defecto sin pedir confirmación al usuario.
<permission android:name="permissionName” android:protectionLevel="levelofprotection">
<permission android:name="permissionName” android:protectionLevel="dangerous" />
Así es como se muestan al usuario los permisos de este tipo cuando requieren confirmación:
<permission android:name="permissionName” android:protectionLevel="signature" />
<permission android:name="permissionName” android:protectionLevel="signatureOrSystem" />
Nosotros utilizamos la tercera signature, lo que nos permitió acceder a los recursos de una aplicación desde la otra sólo en el caso de que las credenciales utilizadas para firmar ambas aplicaciones fueran las mismas, evitando así, que aplicaciones de terceros pudieran acceder a la información que nosotros estábamos exponiendo en un recurso de la aplicación, sin tener que recurrir a lugares públicos del sistema como un ContentProvider y sin tener que tener a la aplicación que quiere acceder al recurso pendiente de que la otra aplicación le pase la información, como sería el caso de un BroadcastReciever.
Además de todo eso, aquí teneís la forma de saber programaticamente el nivel de permiso que tiene una aplicación:
getAplicationContext().getPackageManager().getPermissionInfo(name, 0).protectionLevel