java - 获取字符串数组的联系人

标签 java android

我正在尝试将手机中的所有联系人(姓名和电话号码)保存到一个字符串数组中。我尝试使用这部分代码进行操作,但出现错误 ...

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.

我该如何解决或有更好的方法吗?

最佳答案

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

代替 contacts.getColumnIndex(PhoneLookup.NUMBER);

这样您就可以获得准确的错误详细信息。在这种情况下是:

java.lang.IllegalArgumentException: column 'number' 不存在

意味着您正在尝试获取不存在的列的索引,因此您的 getColumnIndex 方法返回的是预期的 null。

下面的一段代码会给你你想要的:

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:可以根据需要优化此代码以获得更好的性能。

关于java - 获取字符串数组的联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25594030/

相关文章:

java - TACO Java 依赖项

java - 如何在Tomcat 7上部署多个应用

java - 致命异常: main caused by java. lang.NullPointerException菜单按钮

android - 如何判断我使用的是哪个 Android 支持库 v4 修订版?

java - 应用程序停止使用带有倒数计时器的 fragment

java - 如何将日期设置为韩国或其他任何地方的当天?

java - 如何在spring security taglib中不提及hasRole ('ROLE_ADMIN')

java - 使用计时器为 JPanel(滑入)设置动画

Android:如何隐藏在编辑文本框中输入的文本?

android - Galaxy 10.1 运行应用比 Thunderbolt 慢