Esporádico IllegalArgumentException: Desconocido Contenido de URL: //

Muy raramente obteniendo:

Fatal Exception: java.lang.IllegalArgumentException: Unknown URL content://com.example.provider/info at android.content.ContentResolver.insert(ContentResolver.java:1252) Fatal Exception: java.lang.IllegalArgumentException: Unknown authority com.example.provider at android.content.ContentResolver.applyBatch(ContentResolver.java:1247) 

Énfasis en rara vez . Por lo general, funcionan bien sin problema, por lo que las autoridades está configurado bien, pero esto está apareciendo de vez en cuando sin razón. ¿Hay razones por las que ContentResolver no puede encontrar un ContentProvider (es decir, si aún no está configurado)?

He tenido la rara IllegalArgumentException con problemas de URI desconocido cuando estaba haciendo ContentResolver operaciones de ContentResolver en el objeto de Application personalizada.

Por ejemplo, estaba intentando eliminar elementos de mi proveedor de contenido en el método onCreate la aplicación que ocasionaría un fallo muy ocasional :

 public class CustomApplication extends Application { @Override public void onCreate() { //.. context.getContentResolver().delete(ReminderEntry.getContentURI(), null, null, null, null); //.. } } 

Lo que a veces causaría el siguiente fallo:

 Fatal Exception: java.lang.RuntimeException: Unable to create application com.myapp.CustomApplication: java.lang.IllegalArgumentException: Unknown URL content://com.myapp.db.CustomContentProvider/reminder at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6431) at android.app.ActivityThread.access$1800(ActivityThread.java:229) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:7331) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) Caused by java.lang.IllegalArgumentException: Unknown URL content://com.myapp.db.CustomContentProvider/reminder at android.content.ContentResolver.delete(ContentResolver.java:1376) at com.myapp.ReminderEntryDao.delete(Unknown Source) at com.myapp.CustomApplication.onCreate(Unknown Source) at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1037) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6428) at android.app.ActivityThread.access$1800(ActivityThread.java:229) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1887) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:7331) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

También vi un comportamiento similar con un receptor BOOT_COMPLETE . Tenía alrededor de 70 accidentes reportados con esta excepción (en su mayoría dispositivos Infinix ~ 43%, casi ningún dispositivo Samsung) de alrededor de 200 000 usuarios activos mensuales. IllegalArguementException Device Stats

Me trasladé esto en un trabajo programado de fondo y no he visto el accidente desde entonces. Sólo pude reproducir este problema una vez en un dispositivo Nexus que usé pero nunca más.

Sospecho que a veces en algunas versiones de Android en algunos dispositivos el receptor Application / BOOT_COMPLETE inicializa antes de que el ContentProvider se inicialice completamente y por lo tanto cuando intenta tener acceso a él, todavía no está configurado correctamente.

Hay un par de postes de stackoverflow que indican exactamente lo que se crea primero y cómo debe comportarse el sistema operativo:

¿Se garantiza que la clase Application esté instanciada antes de que un receptor de arranque definido se llame

Pero como he dicho, he visto lo contrario y mover las operaciones de las clases en los programadores de fondo parece arreglar el problema (tal vez es sólo porque toma un poco más de tiempo para obtener la configuración). Espero que mi experiencia le ayudará.

Edit: Utilicé el despachador de trabajo de evernote y ContentResolver mis operaciones de ContentResolver al trabajo si era necesario. (Pero supongo que aplazar la operación del proveedor de contenido a cualquier tipo de procesamiento de fondo podría arreglarlo, ya que tenía un poco más de tiempo para obtener la configuración – estas son sólo mis sospechas, por supuesto).

 class DeleteRemindersJob extends Job { @NonNull @Override protected Result onRunJob(final Params params) { cursor = getContext().getContentResolver().delete(ReminderEntry.getContentURI(), null, null, null, null); //.. return Result.SUCCESS; } } 
  • ¿Cómo puedo llamar a getContentResolver en android?
  • Obtener ruta de acceso de archivo desde URI
  • ¿Puedo realizar esta consulta de Android con ContentResolver.query ()? (LEFT JOIN y CASE)
  • Getcontentresolver () devuelve null en un servicio
  • ¿Cómo compartir datos seguros entre dos o más aplicaciones en android?
  • Llamar al método de eliminación en el proveedor de contenido personalizado
  • ¿Cómo acceder a sms tiempo que he recibido en la bandeja de entrada?
  • Cuáles son uri, contentValues
  • Android: Distinct y GroupBy en ContentResolver
  • SyncAdapter animación en ejecución - cómo saber si SyncAdapter está sincronizando activamente
  • ¿Cómo probar una actividad que utiliza un ContentProvider sin afectar la base de datos de producción?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.