Restringir el acceso al proveedor de contenido

No encontré un post que pida la misma restricción que yo.

Tengo una aplicación que proporciona un proveedor de contenido (llamarlo aplicación principal) a otras aplicaciones (llamarlos aplicaciones cliente). Quiero restringir el acceso al proveedor de contenido de las aplicaciones cliente para apoyar sólo el insertar y tal vez métodos de consulta .

Lo que no quiero:

  • Hacer el proveedor de contenido privado porque el objetivo principal es proporcionar una base de datos a las aplicaciones cliente.
  • Restringir el acceso con las firmas de las aplicaciones cliente, ya que cualquier persona debe ser capaz de escribir una aplicación cliente que utilizan la plataforma de aplicación principal.

La solución más obvia que veo es escribir dos proveedores de contenido, uno con acceso completo privado de la aplicación principal, y un público restringido. Pero creo que esto definitivamente no es una manera apropiada.

De acuerdo con este post de grupos de Google , estoy pensando en usar Binder.getCallingUid() en las llamadas del proveedor de contenido para detectar si la llamada proviene de la aplicación principal o no. Así que no puedo hacer nada en los métodos de actualización y eliminación si la llamada no proviene de la aplicación principal.

¿Cómo puedo obtener el UID de la aplicación principal para comparar? Y si es posible, ¿esta solución es segura?

Gracias por su consejo.

Defina un permiso como el siguiente con la firma protectionLevel, este permiso WRITE se restringirá a sólo las aplicaciones que están firmadas con la misma clave privada

 <permission android:name="com.yourapp.WRITE.PERMISSION" android:protectionLevel="signature" android:label="@string/permission_label" android:description="@string/permission_desc"> </permission> <permission android:name="com.yourapp.READ.PERMISSION" android:label="@string/permission_label" android:description="@string/permission_desc"> </permission> 

Luego, en la etiqueta contentprovider, utilice etiquetas de permisos de lectura y escritura. Puede aplicar el permiso de lectura o puede eliminarlo por completo

 android:readPermission="com.yourapp.READ.PERMISSION" android:writePermission="com.yourapp.WRITE.PERMISSION" 

Por lo tanto, sólo las aplicaciones que están firmadas por la misma firma pueden utilizar su proveedor de contenido

Editar:

Tal vez podrías usar esto

  private Collection<String> getCallingPackages() { int caller = Binder.getCallingUid(); if (caller == 0) { return null; } return Lists.newArrayList(mContext.getPackageManager().getPackagesForUid(caller)); } 

Y compruebe si su nombre de paquete está presente en esta lista. Creo que es seguro

  • SecurityException: Permiso de denegación: abrir proveedor
  • ¿Cómo puedo actualizar el cursor desde un CursorLoader?
  • Actualizar imagen de contacto en el proveedor de contactos de Android
  • Content: // mms-sms / conversations / return NullPointerException en Android ICS Samsung
  • ¿Cuáles son la semántica de withValueBackReference?
  • Uso de ContentResolver en lugar de ContentProviderClient en SyncAdapter
  • Android Obtener el grupo de contactos por ID
  • ¿Utilizar datos de proveedores de contexto o solicitar permiso de lectura de Google Fotos?
  • Consulta utilizando MockContentResolver conduce a NullPointerException
  • Proveedores de contenido multiproceso sincronizados a uno predeterminado
  • Android: transacciones SQLite al usar ContentResolver
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.