【问题标题】:How to fetch only phone number contacts from Android device如何从 Android 设备中仅获取电话号码联系人
【发布时间】: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 感谢您的提示。
  • 但我确实多次收到相同的联系人,有什么建议可以避免这种情况

标签: android android-contentprovider android-contacts android-cursor contactscontract


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 2014-05-26
    • 2017-04-13
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    相关资源
    最近更新 更多