android - 如何在任何 Android 手机中查找和收集给定联系人中的所有可用信息?

标签 android android-contentprovider android-contentresolver contactscontract

目前,我在我的应用程序中将手机的所有联系人显示为自定义回收 View 。到目前为止,我在列表项 View 中显示联系人的姓名、手机号码和个人资料图片,但我需要获取该联系人的所有信息,并在自定义详细信息页面中单击我的应用程序的列表项时显示这些信息。

对于每个联系人,都有一组不同的可用信息,例如在少数联系人中我有电子邮件,但对于少数联系人,它不存在。

我的问题是

  1. 如何获取给定联系人的所有信息而不遗漏任何一位。是否有一种结构可以遍历并检查每个键的值?

  2. 此外,当我在我的应用程序列表中填充系统联系人时,我在列表中多次找到相同的联系人。我认为这是因为在我的设备的账户管理器中为许多账户(如 whatsapp、gmail)注册了相同的号码。如果是这样,如何在我的列表中只显示一次该号码。

最佳答案

这是您可以做的:您将拥有您的联系人 id,因此您可以根据它在您的自定义对象中保存电话号码、电子邮件等详细信息 并使用该对象显示详细信息

像这样的自定义类:

class Contact
{
    int contactId;
    String Name;
    ArrayList<Phone> phone;
    ArrayList<Email> emails;
}

class Phone
{
    String PhoneType;
    String number;
}

class Email 
{
    String type;
    String EmailId;
}

检索详细信息并将其添加到您的自定义类:

ContentResolver cr = getContentResolver();
    Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
        "DISPLAY_NAME = '" + NAME + "'", null, null);
    if (cursor.moveToFirst()) {
        String contactId =
            cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
        //
        //  Get all phone numbers.
        //
        Cursor phones = cr.query(Phone.CONTENT_URI, null,
            Phone.CONTACT_ID + " = " + contactId, null, null);
        while (phones.moveToNext()) {
            String number = phones.getString(phones.getColumnIndex(Phone.NUMBER));
            int type = phones.getInt(phones.getColumnIndex(Phone.TYPE));
            switch (type) {
                case Phone.TYPE_HOME:
                    // do something with the Home number here...
                    break;
                case Phone.TYPE_MOBILE:
                    // do something with the Mobile number here...
                    break;
                case Phone.TYPE_WORK:
                    // do something with the Work number here...
                    break;
                }
        }
        phones.close();
        //
        //  Get all email addresses.
        //
        Cursor emails = cr.query(Email.CONTENT_URI, null,
            Email.CONTACT_ID + " = " + contactId, null, null);
        while (emails.moveToNext()) {
            String email = emails.getString(emails.getColumnIndex(Email.DATA));
            int type = emails.getInt(emails.getColumnIndex(Phone.TYPE));
            switch (type) {
                case Email.TYPE_HOME:
                    // do something with the Home email here...
                    break;
                case Email.TYPE_WORK:
                    // do something with the Work email here...
                    break;
            }
        }
        emails.close();
    }
    cursor.close();

希望对你有帮助

关于android - 如何在任何 Android 手机中查找和收集给定联系人中的所有可用信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36059448/

相关文章:

android - ContentResolver.requestSync <= 发送附加信息到 => SyncAdapter.onPerformSync

java - 将二进制字符串转换为字符

android - 通过 Android 发送短信的正确方法

java - 为什么我无法从 Fragment 转换为 MyOwnFragment?

android - 使用 _data 字段在 Android 数据库(自定义内容提供程序)中存储文件 - v1.6

android - 内容解析器返回错误的大小

java - Actionbarsherlock 在 Android 4.x 中不会显示菜单项

android - 将一天的日历事件获取到 android 应用程序中

光标更改时不调用 Android OnLoadFinished()

android - 如何访问不同 Activity 中 fragment 的 contentResolver?