无法读取手机通讯录

时间:2014-12-01 09:04:22

标签: android contacts

我有这个例外

12-01 12:28:42.552: E/AndroidRuntime(25581): Caused by: java.lang.IllegalStateException: Couldn't read row 1, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

当我想使用以下代码阅读手机(SIM)联系人时

 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
         if(cursor.moveToFirst()&&cursor.getCount()>0&&cursor!=null){
            while (cursor.moveToNext()) { 
               // String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)); 
                String name      = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String phone     =  cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

                User user=new User();
                user.setFirstname(name);
                user.setPhoneNumber(phone);
                listdata.add(user);
                cla_contact.notifyDataSetChanged();

            }
            cursor.close();
         }

什么是[问题以及如何解决?

4 个答案:

答案 0 :(得分:0)

这样做

if (cursor.moveToFirst()) {
    while (cursor.moveToNext()) { 
    String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
    String name= cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
    System.out.println(contactID + "   " + name);
    }
 }

它会在读取数据之前将光标移动到第一行。

Makr是正确的,如果它适合你。 :)

答案 1 :(得分:0)

试试这个

 Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
 if(cursor.moveToFirst()){
       while (cursor.moveToNext()) { 
       String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
       String name      = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

       System.out.println(contactID + "   " + name);
       }
 cursor.close();
 }

并确保你在清单中有这个

<uses-permission android:name="android.permission.READ_CONTACTS" />

答案 2 :(得分:0)

尝试这样,

     Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
    if(cursor != null && cursor.getCount() > 0){
if (cursor.moveToFirst()) {
    do {
        String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); 
            String name      = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

          System.out.println(contactID + "   " + name);
    } while (cursor.moveToNext());

    }
        cursor.close();

答案 3 :(得分:0)

将第一行代码替换为以下代码,它对我有用。

 Cursor cursor = 
        getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                     null, null, null, null);

您最好更改条件的顺序,如果&#39;循环以避免空指针异常(如果游标为null)。

 if(cursor!=null && cursor.getCount()>0 && cursor.moveToFirst()){

如果适合您,请接受答案。谢谢。

相关问题