仅从本地联系人获取 Android 联系人

Posted

技术标签:

【中文标题】仅从本地联系人获取 Android 联系人【英文标题】:Getting Android Contacts From Local Contacts Only 【发布时间】:2013-12-16 04:43:50 【问题描述】:

我有一个应用程序,允许用户输入电话号码或从他们的联系人中选择一个。为此,我使用:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
//intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, PICK_CONTACT); //PICK_CONTACT is defined earlier as 1

这很好用,但它包括来自各种应用程序的联系人,例如 Facebook 电子邮件等。如果我取消注释

//intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);

它仅显示您将在“通讯录”应用中看到的联系人,但不会返回电话号码。有什么办法解决吗?

我确实拥有 READ_CONTACTS 权限。

读取联系人Uri的代码

@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) 

    super.onActivityResult(reqCode, resultCode, data);

    if(reqCode != PICK_CONTACT) return;

    Cursor cur = getContentResolver().query(data.getData(), null,
            null, null, null);

    if (cur.getCount() <= 0) return;
    while (cur.moveToNext()) 
    
        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
        if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
        
            // Query phone here. Covered next
            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,null, null); 
            while (phones.moveToNext()) 
                //phone is the EditText view where the user enters a phone number
                phone.setText(phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));

            phones.close(); 
        

    


【问题讨论】:

【参考方案1】:

但它不返回电话号码

如果添加READ_CONTACTS权限,则可以查询ContactsContract,既可以自己展示整个列表,也可以查询得到用户通过ACTION_PICK选择的联系人的电话号码。

没有READ_CONTACTS,您无权通过任何方式访问联系电话号码,除非用户直接在您的应用中输入电话号码。

【讨论】:

忘了说我有 READ_CONTACTS 权限。如果我取消注释该代码行,它仍会返回联系人的电话号码。 @ADiabeticBadger:在您的问题中,您的问题是ACTION_PICK 没有返回电话号码。在您的评论中,您的问题是它正在返回一个电话号码。是哪个? 抱歉,打字有问题。我的意思是,当我取消注释该代码行时,它只显示您将在联系人应用程序中看到的联系人,但即使具有 READ_CONTACTS 权限,它也不会返回电话号码。 @ADiabeticBadger:这正是我的预期,但我没有尝试过在ACTION_PICK 上使用setType() 这种方式,所以我并不完全确定。 ACTION_PICK 应该返回联系人的Uri。使用ContentResolverCursorLoader 查询ContactsContract 以获取所选Uri 的详细信息,包括电话号码。 我已更新主题以显示我的代码以读取 Uri。我需要更改什么才能读取电话号码?

以上是关于仅从本地联系人获取 Android 联系人的主要内容,如果未能解决你的问题,请参考以下文章

云套件:如何仅从您的联系人组获取公共数据库订阅通知

Android:通过周年纪念日事件获取联系人

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

Android联系人光标需要太多时间来迭代

Android 联系人照片:如何从网络上取回 (Google) 联系人图片(因此,“取消”以前的本地图片更改)

Android快速获取联系人