从联系人选择器意图中获取人员的联系方式

Posted

技术标签:

【中文标题】从联系人选择器意图中获取人员的联系方式【英文标题】:Get the contact details of a person from contact picker intent 【发布时间】:2019-07-08 04:50:01 【问题描述】:

我正在尝试访问我从联系人选择器意图中选择的人的联系人姓名、电话号码和地址。 这是我用来打开联系人选择器 Intent 的代码:

这是我正在使用的代码:

Intent intent = new Intent(Intent.ACTION_PICK, 
ContactsContract.Contacts.CONTENT_URI);
    startActivityForResult(intent, PICK_CONTACT);

case PICK_CONTACT:
        if (resultCode == Activity.RESULT_OK) 

          System.out.println("in on ActivityResult");
          Uri contactData = data.getData();
          Cursor c = getActivity().managedQuery(contactData, null, 
null, null, null);
          if (c.moveToFirst()) 
        String id = 
c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));StringhasPhone=c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));

            if (hasPhone.equalsIgnoreCase("1")) 
              Cursor phones             getActivity().getContentResolver().query(ContactsContract.CommonDataKind    s.Phone.CONTENT_URI,
              null,
              ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                  + " = " + id, null, null);
          phones.moveToFirst();
          String cNumber = 
phones.getString(phones.getColumnIndex("data1"));String name phones.getString(phones.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
          //here you can find out all the thing.
          System.out.println("NAME:"+name);
        Cursor postal_cursor=getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI,
            new String[] 
 ContactsContract.CommonDataKinds.StructuredPostal.STREET,

ContactsContract.CommonDataKinds.StructuredPostal.CITY,


ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS,
            ContactsContract.Data.CONTACT_ID + "=? AND " +

ContactsContract.CommonDataKinds.StructuredPostal.MIMETYPE + "=?",
            new String[]String.valueOf(id), 
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE,
            null);
        postal_cursor.moveToFirst();
        while(postal_cursor.moveToNext())
        
          String Strt = 
postal_cursor.getString(postal_cursor.getColumnIndex(

ContactsContract.CommonDataKinds.StructuredPostal.STREET));
          String Cty = 
 postal_cursor.getString(postal_cursor.getColumnIndex(

ContactsContract.CommonDataKinds.StructuredPostal.CITY));
          String cntry = 
 postal_cursor.getString(postal_cursor.getColumnIndex(

 ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
          String address = 
postal_cursor.getString(postal_cursor.getColumnIndex(
              ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS));
        
        postal_cursor.close();   

但我无法获取存储的地址。

感谢任何帮助。谢谢

【问题讨论】:

【参考方案1】:

如果您没有READ_CONTACTS permission,您将只能从Contacts.CONTENT_URI 表中获取信息,而不是电话或邮政地址等特定信息。

如果您想获取电话,可以使用特殊的电话选择器意图,例如:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(CommonDataKinds.Phone.CONTENT_TYPE);
startActivityForResult(intent, REQUEST_CODE);

或获取邮政地址:

Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(CommonDataKinds.StructuredPostal.CONTENT_TYPE);
startActivityForResult(intent, REQUEST_CODE);

请看这里:https://developer.android.com/guide/components/intents-common#PickContactDat

如果您想同时获取这两条信息,则需要向用户询问 READ_CONTACTS permissions 以使这些查询起作用。

【讨论】:

感谢您的回复,我想从联系人选择器中获取姓名和地址。那么如何传递内容类型电话和结构化邮政的意图? 您可以根据自己的意图选择电话或邮政,不能同时选择两者。要获取名称,您可以使用电话或邮政光标的相同光标,例如Phone.CONTACT_NAME 我正在尝试使用电话,但没有从光标获取邮政地址 正如我所说,你不能让两者都使用相同的意图,除非你向用户请求 READ_CONTACTS 权限,然后你可以从 ContactsContract API 查询你想要的任何内容。如果您没有该权限,您只能临时获得一个选项来获取有关联系人的特定数据(电话或邮政,但不能两者兼而有之)

以上是关于从联系人选择器意图中获取人员的联系方式的主要内容,如果未能解决你的问题,请参考以下文章

我们可以在联系人选择器意图中添加按钮吗?

如何从联系人中获取电子邮件和姓氏?

我们可以使用联系人选择器添加联系人意图吗?

Android:联系人选择器意图 |无法实例化类型 Uri

从联系人选择器中获取号码

ios中的联系人选择器以获取电话号码