Android:使用ContactsContract.CommonDataKinds.Phone检索联系人时复制联系人数据

Gau*_*rma 6 java android android-contacts

我已经经历了很多帖子,但没有找到任何能够有效甚至正确回答问题的答案.我最接近的是如何在将联系信息加载到listview时避免重复的联系人姓名(数据)?但这有太大的开销.有没有更简单或更有效的方法来解决这个问题?

Han*_*nde 21

我遇到了同样的问题:我收到了重复的电话号码.我通过获取每个光标条目的标准化数字并使用a HashSet来跟踪我已经找到的数字来解决这个问题.试试这个:

private void doSomethingForEachUniquePhoneNumber(Context context) {
    String[] projection = new String[] {
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER,
            //plus any other properties you wish to query
    };

    Cursor cursor = null;
    try {
        cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);
    } catch (SecurityException e) {
        //SecurityException can be thrown if we don't have the right permissions
    }

    if (cursor != null) {
        try {
            HashSet<String> normalizedNumbersAlreadyFound = new HashSet<>();
            int indexOfNormalizedNumber = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER);
            int indexOfDisplayName = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
            int indexOfDisplayNumber = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);

            while (cursor.moveToNext()) {
                String normalizedNumber = cursor.getString(indexOfNormalizedNumber);
                if (normalizedNumbersAlreadyFound.add(normalizedNumber)) {
                    String displayName = cursor.getString(indexOfDisplayName);
                    String displayNumber = cursor.getString(indexOfDisplayNumber);
                    //haven't seen this number yet: do something with this contact!
                } else {
                    //don't do anything with this contact because we've already found this number
                }
            }
        } finally {
            cursor.close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)