如何从 Android 设备中仅获取电话号码联系人

Posted

技术标签:

【中文标题】如何从 Android 设备中仅获取电话号码联系人【英文标题】:How to fetch only phone number contacts from Android device 【发布时间】:2016-02-16 16:39:33 【问题描述】:

我正在按照这个例子retrieve list of contacts 从安卓设备中检索联系人。 它提供了所有联系人,包括电子邮件联系人和一些空联系人。

我尝试在投影和选择中修改 ContactsContract 之类的 ContactsContract.Contacts.HAS_PHONE_NUMBER 以获取移动联系人,但没有任何结果。

String[] PROJECTION = ContactsContract.Contacts._ID,ContactsContract.Contacts.LOOKUP_KEY,
ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts._ID,
SORT_ORDER,ContactsContract.Contacts.HAS_PHONE_NUMBER;


字符串选择 = ContactsContract.Contacts.DISPLAY_NAME + "''" + " AND "ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1";

知道只获取有手机号码的联系人吗?

【问题讨论】:

使用ContactsContract.CommonDataKinds.Phone.CONTENT_URI @pskink 我尝试在选择中传递 Phone.CONTENT_URI 但给出了无法识别的令牌异常。 为什么投影中有 SORT_ORDER 和 HAS_PHONE_NUMBER ? HAS_PHONE_NUMBER 应该在选择中 - 因为您似乎想根据它进行选择。使用 selection = "HAS_PHONE_NUMBER = 1" 并在正确的查询参数中传递适当的排序顺序。 将 ContactsContract.Contacts.CONTENT_URI 更改为 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 并在选择而不是投影中添加 HAS_PHONE_NUMBER = 1 解决了这个问题,@RocketRandom 感谢您的提示。 但我确实多次收到相同的联系人,有什么建议可以避免这种情况 【参考方案1】:

我创建了这个库来解决您的所有疑问。它只会保存至少有一个电子邮件或电话号码的联系人。它还将从相同联系人的电子邮件和电话号码中删除重复项(由诸如whatsapp之类的第三方应用程序创建)。

欢迎提出建议。

链接:https://github.com/raghavsatyadev/ContactFetcher/

【讨论】:

谢谢,只是它在 Helper.java 中的第 34 行崩溃 number = PhoneNumberUtils.formatNumber(number, "IN").replaceAll("\\s+", "");其他一切都像魅力一样!我们如何在这里面搜索? @kathan shah 我已经在我创建的给定链接上添加了一个库,请检查它【参考方案2】:

您可以使用此代码获取所有联系人姓名和电话号码

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
while (phones.moveToNext())

  String contactName=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
  String contactNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));


phones.close();

【讨论】:

这确实有效,我们可以避免获取电子邮件联系人,但是 1.如何在此查询中按显示名称排序 2.如何消除重复的电话号码 您可以利用 Collections 类来执行排序和其他操作【参考方案3】:

仅显示带有电话号码的联系人并打开联系人列表意图:

Intent pickContactIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); // Uri.parse("content://contacts")
// Show only user contacts with phone numbers
pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE); // Show only user contacts with phone numbers
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);

从回复/联系人中获取电话号码:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    if (requestCode == PICK_CONTACT_REQUEST) 
        if (resultCode == RESULT_OK) 
            Uri contactUri = data.getData();
            String[] projection = ContactsContract.CommonDataKinds.Phone.NUMBER;

            Cursor cursor = getActivity().getContentResolver().query(contactUri, projection, null, null, null);
            if (cursor == null) 
                // show error msg
                return;
            
            cursor.moveToFirst();

            int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            if (column >= 0) 
                String phoneNo = cursor.getString(column);
                sendSmsMessage(phoneNo);
             else 
                // show error msg
            
            cursor.close();
        
    

确保您还在 API 23+ 中处理运行时权限

android.permission.READ_CONTACTS

【讨论】:

以上是关于如何从 Android 设备中仅获取电话号码联系人的主要内容,如果未能解决你的问题,请参考以下文章

如何从电话簿中获取与 android 中特定联系人相关联的所有社交帐户?

如何从设备获取联系电话?

如何从android中的给定电话号码获取电话号码类型标签

从具有两个以上联系号码的联系人中仅选择一个号码

如何从android中的联系人姓名获取联系人的号码

Android - 从电话号码获取联系人照片