androidandroid-contentproviderandroid-contactscontactscontractandroid-cursorloader

Support CursorLoader with EXTRA_ADDRESS_BOOK_INDEX


I am using a support CursorLoader to load Contacts.

When using an API larger than 21, I call

loader.setUri(ContactsContract.Data.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.Data.EXTRA_ADDRESS_BOOK_INDEX, "true").build());

Meaning I will get an index of the contacts' first letters.

Upon loading, I receive this crash:

Writing exception to parcel
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] android.os.BaseBundle.getStringArray(java.lang.String)' on a null object reference
at com.android.providers.contacts.FastScrollingIndexCache.put(FastScrollingIndexCache.java:237)
at com.android.providers.contacts.ContactsProvider2.bundleFastScrollingIndexExtras(ContactsProvider2.java:8320)
at com.android.providers.contacts.ContactsProvider2.queryLocal(ContactsProvider2.java:7803)
at com.android.providers.contacts.ContactsProvider2.queryDirectoryIfNecessary(ContactsProvider2.java:6083)
at com.android.providers.contacts.ContactsProvider2.query(ContactsProvider2.java:6065)
at com.android.providers.contacts.SemcContactsProvider2.query(SemcContactsProvider2.java:550)
at android.content.ContentProvider$Transport.query(ContentProvider.java:247)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
at android.os.Binder.execTransact(Binder.java:570)

As well as

java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:161)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
at java.lang.Thread.run(Thread.java:761)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] android.os.BaseBundle.getStringArray(java.lang.String)' on a null object reference
at android.os.Parcel.readException(Parcel.java:1689)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:421)
at android.content.ContentResolver.query(ContentResolver.java:537)
at android.support.v4.content.ContentResolverCompat.query(ContentResolverCompat.java:80)
at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:61)
at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:39)
at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:306)
at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:59)
at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:47)
at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:138)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)

Can anyone help out?

UPDATE

The same occurs when using the ContractsData.CommonDataKinds.Phone view, even although the column is exposed


Solution

  • From the docs example code it looks like they're appending this parameter to Contacts.CONTENT_URI not Data.CONTENT_URI like you do.

    Uri uri = Contacts.CONTENT_URI.buildUpon()
              .appendQueryParameter(Contacts.EXTRA_ADDRESS_BOOK_INDEX, "true")
              .build();
    

    You said you're using CursorLoader to load Contacts, then you might want to query on the Contacts.CONTENT_URI table for that, the Data.CONTENT_URI is meant for getting specific details (emails, phones, etc.) on contacts, not basic info like name or pic.