2014-08-31 104 views
1

我试图从我的手机所有联系人(姓名和电话号码)到一个字符串数组。我尝试过用典但是我得到一个错误这部分...获取联系人字符串数组

Cursor contacts = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
String aNameFromContacts[] = new String[contacts.getCount()]; 
String aNumberFromContacts[] = new String[contacts.getCount()]; 

int ij = 0; 

int nameFieldColumnIndex = contacts.getColumnIndex(PhoneLookup.DISPLAY_NAME); 
int numberFieldColumnIndex = contacts.getColumnIndex(PhoneLookup.NUMBER); 

while(contacts.moveToNext()) { 
    String contactName = contacts.getString(nameFieldColumnIndex); 
    aNameFromContacts[ij] = contactName ; 
    String number = contacts.getString(numberFieldColumnIndex); 
    aNumberFromContacts[ij] = number ; 
    ij++; 
    contacts.close(); 

以下是错误:

08-31 18:09:09.031: E/CursorWindow(16317): Failed to read row 0, column -1 from a CursorWindow which has 109 rows, 44 columns. 

我怎样才能解决这个问题还是有更好的办法?

回答

1

始终使用contacts.getColumnIndexOrThrow(PhoneLookup.NUMBER);

,而不是contacts.getColumnIndex(PhoneLookup.NUMBER);

所以,你可以得到确切的错误信息。在这种情况下,它是:

java.lang.IllegalArgumentException: column 'number' does not exist

意味着你正在试图获得列的索引中不存在这样的getColumnIndex方法返回为空预期。

下面这段代码会给你想要的东西:

ContentResolver cr = getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, 
      null, null, null); 
    String aNameFromContacts[] = new String[cur.getCount()]; 
    String aNumberFromContacts[] = new String[cur.getCount()]; 
    int j = 0; 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String id = cur.getString(cur 
        .getColumnIndexOrThrow(ContactsContract.Contacts._ID)); 
      String name = cur 
        .getString(cur 
          .getColumnIndexOrThrow(ContactsContract.Contacts.DISPLAY_NAME)); 

      if (("1") 
        .equals(cur.getString(cur 
          .getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER)))) { 
       Cursor pCur = cr.query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
           + " = ?", new String[] { id }, null); 
       int i = 0; 
       int pCount = pCur.getCount(); 
       String[] phoneNum = new String[pCount]; 
       String[] phoneType = new String[pCount]; 
       while (pCur.moveToNext()) { 
        phoneNum[i] = pCur 
          .getString(pCur 
            .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        phoneType[i] = pCur 
          .getString(pCur 
            .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.TYPE)); 

        i++; 
       } 
       if (phoneNum.length > 0) { 
        aNumberFromContacts[i] = phoneNum[0]; 
        aNameFromContacts[j] = name; 
        Log.d("name = ", "" + name +", phoneNumber = " + phoneNum[0]); 
       } 
      } 
      j++; 
     } 
    } 

也试图理解这个代码,这样你就会明白它是如何工作的,什么是PHONENUM和PHONETYPE。

PS:可根据需要对此代码进行优化以获得更好的性能。

+1

谢谢你很多:) – user3339279 2014-09-01 15:44:32