2011-05-08 16 views
7

Estoy tratando de leer el contenido de un cursor de este modo:Android denegación de permisos si otra aplicación en la que no instala por primera vez

cursor = context.getContentResolver().query(TASKS_URI, null, null, new String[]{"-1", "true"}, null); 

Cuando el TASKS_URI es:

private final static Uri TASKS_URI = Uri.parse("content://org.dayup.gtask.data/tasks"); 

Así que todo lo que estoy tratando hacer es obtener un cursor de otra aplicación.

En mi manifest.xml defino mi permiso como:

<uses-permission android:name="org.dayup.gtask.permission.READ_TASKS"/> 

El problema es que si mi aplicación se instaló antes que la otra aplicación (en este caso gtask) me sale el siguiente error:

05-08 15:26:45.380: ERROR/ActivityThread(18564): Failed to find provider info for org.dayup.gtask.key 
05-08 15:26:45.390: ERROR/AndroidRuntime(18509): FATAL EXCEPTION: Thread-12 
java.lang.SecurityException: Permission Denial: reading org.dayup.gtask.GoogleTaskProvider uri content://org.dayup.gtask.data/tasks from pid=18509, uid=10114 requires org.dayup.gtask.permission.READ_TASKS 
at android.os.Parcel.readException(Parcel.java:1322) 
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160) 
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114) 
at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:372) 
at android.content.ContentProviderProxy.query(ContentProviderNative.java:408) 
at android.content.ContentResolver.query(ContentResolver.java:264) 

Si vuelvo a instalar mi aplicación o si mi aplicación se instaló después de las demás, todo funciona bien. ¿Alguna idea sobre cómo volver a adquirir estos permisos en tiempo de ejecución?

+0

Se puede utilizar Android: required = "false" para los permisos o es que sólo presenta? –

+0

No creo que puedas, el problema es que las otras aplicaciones (correctamente) comprueban si mi aplicación tiene permisos y luego niegan el permiso de mi aplicación, por lo que se requiere permiso. – PhilipK

Respuesta

4

Hay una solución para esto. El truco consiste en definir los permisos como si fueran propios.

Aquí se muestra un ejemplo:

<uses-permission android:name="com.timsu.astrid.permission.READ_TASKS" /> 
<permission android:name="com.timsu.astrid.permission.READ_TASKS" 
    android:permissionGroup="android.permission-group.PERSONAL_INFO" 
    android:protectionLevel="dangerous" android:label="read astrid tasks data" /> 
<uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE" /> 
<!-- dato gtask --> 
<uses-permission android:name="org.dayup.gtask.permission.READ_TASKS" /> 
<permission android:name="org.dayup.gtask.permission.READ_TASKS" 
    android:permissionGroup="android.permission-group.PERSONAL_INFO" 
    android:protectionLevel="dangerous" android:label="read dato gtasks tasks data" /> 
+0

Desafortunadamente, esto ya no funciona con Lollipop y causa una excepción cuando dos aplicaciones definen el mismo permiso. – aap

1

página de seguridad de Android dice

En aplicación tiempo de instalación, permisos solicitados por la aplicación se le atribuye en la instalación del paquete, a partir de controles contra las firmas de las aplicaciones que declaran esos permisos y/o interacción con el usuario. No se realizan comprobaciones con el usuario mientras se ejecuta una aplicación: se le otorgó un permiso particular cuando está instalado y puede usar esa función como se desee, o no se otorgó el permiso y cualquier intento de usar la característica fallará sin preguntar el usuario.1

así que no creo que pueda cambiar los permisos de tiempo de ejecución. La única forma en que puedo ver para evitar esto sería tener una especie de aplicación envoltura con android.permission.INSTALL_PACKAGES conjunto que comprueba la aplicación requerida y la instala antes de instalar la tuya.

Cuestiones relacionadas