Negación de permisos de Android en Widget RemoteViewsFactory para contenido

Tengo un widget que estoy tratando de usar para mostrar información de la base de datos local de mi aplicación dentro de un listview.

Estoy utilizando la interfaz RemoteViewsService.RemoteViewsFactory para cargar el contenido de mi lista. Si ejecuto el bloque de código que vuelve a cargar la lista en el método onDataSetChanged. La aplicación se bloquea con el siguiente mensaje:

11-01 16:40:39.540: E/ACRA(27175): DataDisplay fatal error : Permission Denial: reading com.datadisplay.content.ContentProviderAdapter uri content://com.datadisplay.provider.internalDB/events from pid=573, uid=10029 requires the provider be exported, or grantUriPermission()

Sin embargo, este mismo código ejecutado en el constructor de la clase funciona bien. Por supuesto, necesito tener esto también trabajo en el método onDataSetChanged para la actualización y el material.

Esta es la entrada de mi proveedor en el manifiesto:

  <provider android:name="com.datadisplay.content.ContentProviderAdapter" android:authorities="com.datadisplay.provider.internalDB" android:exported="true" android:enabled="true" android:grantUriPermissions="true"> <grant-uri-permission android:pathPattern="/events/"/> </provider> 

Lo estoy exportando Y concediendo permisos de Uri como las peticiones de mensaje de error, pero todavía falla. He encontrado esta pregunta, donde el tipo tenía un problema, pero eventualmente elimina sus permisos personalizados y funcionó. No tengo ningún permiso personalizado como ese, pero todavía no hay suerte:

Widget con el proveedor de contenido; Imposible de usar ReadPermission?

Si alguien tiene una idea que estaría muy agradecido, esto es increíblemente frustrante, jaja.

Ponga esto en su método onDataSetChanged() :

  Thread thread = new Thread() { public void run() { query(); } }; thread.start(); try { thread.join(); } catch (InterruptedException e) { } 

Obtener datos de la base de datos dentro del método query() . No sé por qué la búsqueda de datos en un hilo separado ayuda a evitar este problema, pero funciona! Tengo esto de uno de los ejemplos de Android.

Esto sucede porque RemoteViewsFactory se está llamando desde un proceso remoto y ese contexto se utiliza para la aplicación de permisos. (El llamador remoto no tiene permiso para usar su proveedor, por lo que lanza SecurityException.)

Para solucionar esto, puede borrar la identidad del proceso remoto, de modo que la verificación del permiso se compruebe en su aplicación en lugar de en la llamada remota. Este es un patrón común que encontrará en la plataforma:

 final long token = Binder.clearCallingIdentity(); try { [perform your query, etc] } finally { Binder.restoreCallingIdentity(token); } 

Si esto sólo ocurre en 4.2 y no en el resto, debe establecer el android: exportado = "true", porque se cambia el valor predeterminado: http://developer.android.com/about/versions/android-4.2.html

Los proveedores de contenido ya no se exportan de forma predeterminada. Es decir, el valor predeterminado para el atributo android: export es ahora "false" .Si es importante que otras aplicaciones puedan acceder a su proveedor de contenido, debe establecer explícitamente android: export = "true".

  • Mostrando edittext oblicuamente en android
  • Cómo iniciar la actividad después de presionar el botón widget?
  • DeslizanteDibujador sin mango y acciones deslizantes al contenido
  • Obtención de coordenadas de clics en Android ListView OnItemClickListener
  • Efecto extraño con ImageView startAnimation en ListView
  • Cambiar el color de texto de ListView
  • Datos de la tienda de widgets android
  • Cómo cambiar el color del divisor predeterminado para todos los ListViews
  • Uso de drawables internos de android
  • Cómo crear un menú de barra lateral
  • Android: adjunta datos a las vistas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.