EXTRA_ADDRESS_BOOK_INDEX 支持 CursorLoader

Support CursorLoader with EXTRA_ADDRESS_BOOK_INDEX

我正在使用支持 CursorLoader 加载联系人。

当使用大于 21 的 API 时,我调用

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

这意味着我将获得联系人首字母的索引。

加载后,我收到此崩溃消息:

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)

以及

java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.support.v4.content.ModernAsyncTask.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.call(ModernAsyncTask.java:138)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)

有人能帮忙吗?

更新

使用 ContractsData.CommonDataKinds.Phone 视图时会发生同样的情况,即使该列已公开

从文档示例代码来看,他们似乎将此参数附加到 Contacts.CONTENT_URI 而不是像您那样 Data.CONTENT_URI

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

你说你正在使用 CursorLoader 加载 Contacts,那么你可能想在 Contacts.CONTENT_URI table 上查询 Data.CONTENT_URI ] 用于获取联系人的具体详细信息(电子邮件、电话等),而不是姓名或照片等基本信息。