Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Restringe las interacciones con otras apps

Los permisos no solo se utilizan para solicitar funcionalidades del sistema. También puedes restringir las maneras en las que otras apps pueden interactuar con los componentes de la tuya.

En esta guía, se explica cómo ver el conjunto de permisos que declaró otra app. También se explica cómo puedes configurar actividades, servicios, proveedores de contenido y receptores de emisión para restringir las maneras en las que otras apps pueden interactuar con la tuya. Por último, en esta página, se proporciona orientación sobre otras maneras de aplicar patrones de interacción entre apps.

Cómo ver los permisos de otra app

Si quieres ver el conjunto de permisos que declara otra app, usa un dispositivo o emulador para completar los siguientes pasos:

  1. Abre la pantalla Información de la app de una app.
  2. Selecciona Permisos. Se abrirá la pantalla Permisos de la app.

    En esta pantalla, se muestra un conjunto de grupos de permisos. El sistema organiza el conjunto de permisos que una app declaró en estos grupos.

Restringe las interacciones con las actividades de tu app

Los permisos aplicados con el atributo android:permission en la etiqueta <activity> del manifiesto fijan restricciones respecto de los usuarios que pueden iniciar esa Activity. Se verifica el permiso durante Context.startActivity() y Activity.startActivityForResult(). Si el llamador no tiene el permiso necesario, se producirá un evento SecurityException.

Restringe las interacciones con los servicios de tu app

Los permisos aplicados con el atributo android:permission en la etiqueta <service> del manifiesto fijan restricciones respecto de los usuarios que pueden iniciarlo o vincularlo con el Service asociado. Se verifica el permiso durante Context.startService(), Context.stopService() y Context.bindService(). Si el llamador no tiene el permiso necesario, se producirá un evento SecurityException.

Restringe las interacciones con los proveedores de contenido de tu app

Los permisos aplicados con el atributo android:permission en la etiqueta <provider> fijan restricciones respecto a quiénes pueden acceder a los datos en un ContentProvider (los proveedores de contenido disponen de un recurso adicional importante que se denomina permisos del URI y se describe a continuación). A diferencia de los otros componentes, puedes establecer dos atributos de permisos separados: android:readPermission restringe quién puede leer del proveedor y android:writePermission restringe quién puede escribir en él. Ten en cuenta que si un proveedor está protegido con un permiso de escritura y uno de lectura, tener el permiso de escritura no implica que puedas realizar operaciones de lectura en un proveedor.

Los permisos se verifican cuando obtienes un proveedor por primera vez (si no tienes ninguno de los permisos, se produce un evento SecurityException) y cuando realizas operaciones en el proveedor. Se necesita permiso de lectura a fin de usar ContentResolver.query(), mientras que el uso de ContentResolver.insert(), ContentResolver.update() o ContentResolver.delete() requiere permiso de escritura. En todos estos casos, si no tienes el permiso obligatorio, se genera una SecurityException.

Permite el acceso según URI

El sistema te proporciona un control detallado adicional sobre las maneras en las que otras apps pueden acceder a los proveedores de contenido de tu app. En particular, tu proveedor de contenido puede protegerse con permisos de lectura y escritura, a la vez que permite que los clientes directos del proveedor compartan URI específicos con otras apps. Para declarar la compatibilidad de tu app con este modelo, usa el atributo android:grantUriPermissions o el elemento <grant-uri-permission.

También puedes otorgar permisos según URI. Cuando inicies una actividad o le muestres un resultado a una actividad, establece una o ambas de estas marcas de intent: Intent.FLAG_GRANT_READ_URI_PERMISSION o Intent.FLAG_GRANT_WRITE_URI_PERMISSION. Esto otorga a otra app permisos de lectura, escritura y lectura/escritura, según corresponda, para el URI de datos incluido en el intent. La otra app obtiene estos permisos para el URI específico, independientemente de que tenga permiso para acceder a los datos en el proveedor de contenido en general.

Por ejemplo, supongamos que un usuario está viendo un correo electrónico en tu app y que incluye una imagen como archivo adjunto. Otras apps no deberían poder acceder al contenido del correo electrónico en general, pero pueden estar interesadas en ver la imagen. Tu app puede usar un intent y la marca de intent Intent.FLAG_GRANT_READ_URI_PERMISSION para que una app de visualización de imágenes la vea.

Otro aspecto que debes tener en cuenta es la visibilidad de la app. Si tu app se orienta a Android 11 (nivel de API 30) o una versión posterior, el sistema hace que algunas apps sean visibles automáticamente, pero oculta otras de forma predeterminada. Si tu app tiene un proveedor de contenido y le otorgó permisos de URI a otra, será visible automáticamente para la otra app.

Para obtener más información, consulta el material de referencia de los métodos grantUriPermission(), revokeUriPermission() y checkUriPermission().

Restringe las interacciones con los receptores de emisión de tu app

Los permisos aplicados con el atributo android:permission en la etiqueta <receiver> fijan restricciones respecto de la autorización para enviar emisiones al BroadcastReceiver asociado. Se verifica el permiso después de que se muestra Context.sendBroadcast(), mientras el sistema intenta proporcionar la emisión enviada al receptor en cuestión. En consecuencia, un error de permisos no generará una excepción para el emisor, sino que únicamente no proporcionará el Intent.

De la misma manera, se le puede suministrar un permiso a Context.registerReceiver() para tener control sobre quiénes pueden realizar emisiones a un receptor registrado programáticamente. Por otro lado, se puede suministrar un permiso cuando se llama a Context.sendBroadcast() a fin de restringir los receptores de emisión que tienen autorización para recibirla.

Ten en cuenta que tanto un receptor como un emisor pueden requerir un permiso. Cuando esto sucede, deben aprobarse ambas verificaciones de permisos para que se proporcione el intent al objetivo asociado. Para obtener más información, consulta Cómo restringir emisiones con permisos.

Otras verificaciones de permisos

Existen varias otras formas útiles de verificar los permisos.

  • Durante una llamada a un servicio, pasa una string de permiso a Context.checkCallingPermission(). Este método muestra un número entero que indica si se otorgó ese permiso al proceso de llamada actual. Ten en cuenta que esto solo se puede usar cuando ejecutas una llamada que ingresa de otro proceso; por lo general, mediante una interfaz IDL publicada por un servicio o proporcionada de alguna manera diferente a otro proceso.
  • Para verificar si se le otorgó un permiso específico a otro proceso, pasa el proceso (PID) a Context.checkPermission().
  • Para verificar si se le otorgó un permiso específico a otro paquete, pasa el nombre del paquete a PackageManager.checkPermission().