如何从 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 设备中仅获取电话号码联系人的主要内容,如果未能解决你的问题,请参考以下文章