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)?
- Android Contacts.CONTENT_STREQUENT_URI lanza SQLiteException en Android 4.1.2 y 4.4.2
- Cuando se llama a ContentResolver.notifyChange () para un URI determinado, ContentObservers observa los URI descendientes de este URI notificados?
- Cómo actualizar el hilo de sms después de insertar un borrador en "content: // sms / draft"
- ¿Cómo notificar a la actividad de llamada cuando SyncAdapter ha finalizado?
- Cómo agregar un enlace a mi aplicación desde el menú rápido de contactos
- ¿El método notifyChange de ContentResolver notifica también el detalle de Uri?
- Inserción de un vídeo en MediaStore
- No se pueden eliminar contactos de la tarjeta SIM
- ¿Para qué se utiliza cursor.setNotificationUri ()?
- Cómo actualizar una foto de contacto nativa en android?
- Editar nombre / número de teléfono de contacto programáticamente
- Consulta utilizando MockContentResolver conduce a NullPointerException
- ¿Cuáles son las ventajas de usar un ContentProvider sobre el almacenamiento SQLIte normal?
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.
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; } }
- ¿Por qué la recepción de multidifusión no funciona en algunos dispositivos Android?
- Mantener los métodos Java llamados desde Android JNI