Android 获取联系人到应用程序

Posted

技术标签:

【中文标题】Android 获取联系人到应用程序【英文标题】:Android Fetch Contacts into the Application 【发布时间】:2013-04-12 12:02:05 【问题描述】:

我正在尝试在应用程序内的列表视图中显示来自用户电话的联系人列表。我可以获取联系人,但有些联系人会有多个手机号码,所以我想多次显示那个人。

Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    String name, number = "";
    String id;
    c.moveToFirst();
    for (int i = 0; i < c.getCount(); i++) 
        name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
        id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));

        if (Integer.parseInt(c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
            Cursor pCur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]  id ,
                    null);
            while (pCur.moveToNext()) 
                number = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            
        
        Log.i("name ", name + " ");
        Log.i("number ", number + " ");
        c.moveToNext();

希望向用户显示与他拥有的号码一样多的次数。我什至可以仅根据 10 位数长的手机号码列出它吗?

Example

Name: John Doe 
Number 1: xxxxxxxxx
Number 2: xxxxxxxxx

Name: Sarah 
Number 1: xxxxxxxxx

这应该返回如下三个列表项

John Doe  xxxxxxxxx
John Doe  xxxxxxxxx
Sarah     xxxxxxxxx

【问题讨论】:

你有什么问题? @mach 想要向用户显示与他拥有的号码一样多的次数。我什至可以仅根据 10 位数长的手机号码将其列入短名单吗? 您不想使用 ExpandableListView 并将数字作为子元素吗? 不,我希望它们作为单独的列表项,以便用户可以选择它。我想获取姓名和电话号码。 ValueObject :O 类具有一些属性和访问这些属性的方法 【参考方案1】:

你可以试试这样的

List<PhoneItem> phoneNoList = new ArrayList<PhoneItem();
Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
String name, number = "";
String id;
c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) 
    name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
    id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));

    if (Integer.parseInt(c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
        Cursor pCur = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]  id ,
                null);
        while (pCur.moveToNext()) 
            phoneNoList.add(new PhoneItem(name, pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))));
        
    
    c.moveToNext();




for (PhoneItem row : phoneNoList) 
    Log.i("name", row.name);
    Log.i("number", row.number+"");


[...]

private class PhoneItem 
   String name;
   String phone;

   public PhoneItem(String name, String phone) 
       this.name = name;
       this.phone = phone;
   

【讨论】:

【参考方案2】:

下面的代码将获取所有带有电话号码的联系人。可能存在重复,因为同一个联系人可能属于不同的组。您必须循环并消除重复项。

String[] projection = new String[] ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                                    ContactsContract.CommonDataKinds.Phone.NUMBER,;
String selection = ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER + "=?" ;  
String[] selectionArgs = new String[] "1";                            
Cursor c = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                                    projection, 
                                    selection, 
                                    selectionArgs, 
                                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                                    + ", " + ContactsContract.CommonDataKinds.Phone.NUMBER);

【讨论】:

以上是关于Android 获取联系人到应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何将选定的电子邮件从 android 联系人获取到应用程序? [复制]

获取 Android 手机联系人的跨设备唯一 ID

Android快速获取联系人

android开发怎样获取通讯录联系人信息

我可以在 android 上启动联系人应用程序并实际获取所选联系人的手机号码吗?

无法从 Android 获取所有联系人