仅从本地联系人获取 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
。使用ContentResolver
或CursorLoader
查询ContactsContract
以获取所选Uri
的详细信息,包括电话号码。
我已更新主题以显示我的代码以读取 Uri。我需要更改什么才能读取电话号码?以上是关于仅从本地联系人获取 Android 联系人的主要内容,如果未能解决你的问题,请参考以下文章
如何将选定的电子邮件从 android 联系人获取到应用程序? [复制]