未经许可获取特定联系人的电子邮件地址

Posted

技术标签:

【中文标题】未经许可获取特定联系人的电子邮件地址【英文标题】:Obtaining Email Addresses of Specific Contact Without Permissions 【发布时间】:2021-07-20 06:40:00 【问题描述】:

我可以使用以下示例 sn-ps 轻松获取每个联系人的每个电子邮件地址的列表:

//...
private val getPerson = registerForActivityResult(PickContact()) 
        it?.also  contactUri ->
            val personDetails = ContactForPerson("", "", "")

            val projection = arrayOf(
                ContactsContract.CommonDataKinds.Phone.LOOKUP_KEY,          //String
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY,//String
                ContactsContract.CommonDataKinds.Email.ADDRESS,             //String
            )

            context?.contentResolver?.query(contactUri, projection, null, null, null)?.apply 
                moveToFirst()
                personDetails.apply 
                    uri = getStringOrNull(0)
                    name = getString(1)
                    email = getStringOrNull(2)
                
                close()
            
        
    

//...

fab.setOnClickListener 
//...
          getPerson.launch(0)
//...


//...

class PickContact : ActivityResultContract<Int, Uri?>() 
    override fun createIntent(context: Context, input: Int?) =
            Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI).also 
                it.type = ContactsContract.CommonDataKinds.Email.CONTENT_TYPE
            

    override fun parseResult(resultCode: Int, intent: Intent?): Uri? =
        if (resultCode == RESULT_OK) intent?.data else null

问题是,既然我已经有了一些联系人的信息,有没有办法让我过滤每个联系人的每个电子邮件地址的巨大列表,只显示一个联系人的电子邮件地址?

我注意到Get specific contact information from URI returned from Intent.ACTION_PICK,但该信息已过时,不清楚是否需要 READ_CONTACTS 权限,这是不希望的。

谢谢。

【问题讨论】:

【参考方案1】:

通过将 Intent 类型设置为 Email.CONTENT_TYPE,您似乎调用的是 EMAIL-PICKER 而不是 CONTACT-PICKER。

这意味着用户将在设备的默认联系人应用中选择特定的电子邮件。

然后您从选择器获得的结果不是contactUri,而是dataUri - 即指向Data 表中特定行的uri,它仅允许您获取有关该特定行的信息,在这种情况下,它必须是电子邮件行。

这也意味着通过使用CommonDataKinds.Phone.X 下的字段,您的投影有点有趣,这无关紧要,因为这些字段是从 Data.CONTENT_URI 继承的,但为了防止混淆,您可能应该将它们替换为:

Data.LOOKUP_KEY, 
Data.DISPLAY_NAME_PRIMARY,
Email.ADDRESS,   

现在,如果您想要所有联系人的电子邮件而不是单个电子邮件,则不应设置意图类型 - 这将启动一个联系人选择器,允许您通过检索实体来获取联系人的电子邮件 + 电话 + 姓名显示here。

【讨论】:

以上是关于未经许可获取特定联系人的电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 iCloud 获取联系人的电子邮件地址吗?

获取作为 Exchange 用户的收件人的电子邮件地址

从电话联系人中获取姓名、电话号码和电子邮件地址[关闭]

android电子邮件地址获取、存储和显示

使用 mailcore (iOS),我如何从特定电子邮件地址获取所有电子邮件?

在线表格如何阻止特定的电子邮件地址[关闭]