当前位置: 首页 > 知识库问答 >
问题:

异步获取联系人时发生IllegalStateException

东郭子默
2023-03-14

当我尝试使用以下代码在onCreate方法中获取联系人时,

Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,ContactsContract.Contacts.DISPLAY_NAME);
    if (c.getCount()>0) {
        Log.e("Number of contacts :",String.valueOf(c.getCount()));
        while (c.moveToNext()) {
            Log.i("Contacts", c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
        }
    }

它起作用了。但是当我把代码移到asyncTask-doIn后台时,它会给出IllegalStateExcure。这是我的密码

protected ArrayList<String> doInBackground(Void... params) {
        Cursor c = mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null ,null,null,ContactsContract.Contacts.DISPLAY_NAME);
        ArrayList<String> x = new ArrayList<>();
        if (c.getCount() > 0) {
            StringBuilder sb = new StringBuilder();
            while (c.moveToNext()) {
                sb.append(c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
                x.add(sb.toString());
                Log.i("Contacts",sb.toString());
            }
        }
        return x;
    }

这里是我的logCat输出

E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:299)
        at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
        at java.util.concurrent.FutureTask.run(FutureTask.java:137)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
        at java.lang.Thread.run(Thread.java:856)
 Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
        at android.database.CursorWindow.nativeGetString(Native Method)
        at android.database.CursorWindow.getString(CursorWindow.java:434)
        at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
        at android.database.CursorWrapper.getString(CursorWrapper.java:114)
        at akshara.xcontacts.adapters.ContactsListAdapter$ContactsLoader.doInBackground(ContactsListAdapter.java:100)
        at akshara.xcontacts.adapters.ContactsListAdapter$ContactsLoader.doInBackground(ContactsListAdapter.java:77)
        at android.os.AsyncTask$2.call(AsyncTask.java:287)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

有人知道我的代码有什么问题吗?

共有1个答案

储嘉悦
2023-03-14

确保在执行AsyncWork之前实例化mContext

如果不起作用,请尝试以下方法

使用ArrayList

而不是:

ArrayList<String> x = new ArrayList<>();

 类似资料:
  • 问题内容: 我想获取联系人姓名,但无法。看完这个答案后,我尝试使用family,给定的和显示的来获取名称,但没有任何效果 / 问题答案: 尝试以下代码以获取特定号码的联系方式 更多详细信息请参见下面的链接https://tausiq.wordpress.com/2012/08/23/android-get-contact- details-id-name-phone-photo/

  • 问题内容: 是否可以在一个查询中完成? 据我所知sim联系人的内容uri是 问题答案: 这很容易!:)

  • 本文向大家介绍Android获取手机联系人信息,包括了Android获取手机联系人信息的使用技巧和注意事项,需要的朋友参考一下 Android如何获取手机联系人信息,本文为大家揭晓。 获取手机联系人信息步骤: 1、获取 ContentResolver ContentResolver resolver = getContentResolver(); 2、resolver.query(*)查询信息 查

  • 问题内容: 我正在尝试阅读我的iOS通讯录的联系人图像,但遇到了一些 麻烦。 我有一个读取ABAddressBookRef的联系人信息 并将其放在结构上的方法。 but when I debug it, it stops on: 并且不显示任何错误消息。 我究竟做错了什么? 我正在使用模拟器的默认联系人对其进行测试,他们没有图像, 但是有占位符及其名字的第一个字母。 编辑: 我将代码更改为 并且在

  • 问题内容: 我知道ios swift有一个Contacts Framework ,可以在其中获取联系人,但是找不到任何方法可以一起获取所有联系人,而我可以从该数组访问每个联系人。所有用于获取联系人的方法似乎都需要某种条件。有什么方法可以将所有联系人聚集在一起? 谢谢 问题答案: 有关Contact Framework问题的许多答案都建议对各种容器(帐户)进行迭代。但是,Apple文档将“统一联系人

  • 本文向大家介绍Android ContentProvider获取手机联系人实例,包括了Android ContentProvider获取手机联系人实例的使用技巧和注意事项,需要的朋友参考一下 在做项目的时候,因为要用到我们自动获取联系人的姓名和电话,就想到了ContentProvider分享数据的功能,这样做既节省了时间,也减少了我们输入错误号码的几率,所以,想在这里把小demo分享给大家,方便以