Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 正在尝试使用电子邮件地址获取联系人ID_Android_Contacts_Android Contacts - Fatal编程技术网

Android 正在尝试使用电子邮件地址获取联系人ID

Android 正在尝试使用电子邮件地址获取联系人ID,android,contacts,android-contacts,Android,Contacts,Android Contacts,我知道,使用聚合时,联系人ID不是静态的,但可能会随着时间的推移而变化(请参阅:) 因此,在我的应用程序中,我存储了内容查找键和选定联系人的当前id 我想做的是:当一条消息来自某个特定的电子邮件地址时,查询电话联系人,查看该电子邮件地址中的联系人是否与其中任何人关联,然后将该联系人与我存储的联系人进行比较,首先使用我存储的联系人id和查找键进行新的查询,以获取当前联系人id 以下是我如何尝试使用电子邮件地址查找联系人id: String[] projection = { Contacts

我知道,使用聚合时,联系人ID不是静态的,但可能会随着时间的推移而变化(请参阅:)

因此,在我的应用程序中,我存储了内容查找键和选定联系人的当前id

我想做的是:当一条消息来自某个特定的电子邮件地址时,查询电话联系人,查看该电子邮件地址中的联系人是否与其中任何人关联,然后将该联系人与我存储的联系人进行比较,首先使用我存储的联系人id和查找键进行新的查询,以获取当前联系人id

以下是我如何尝试使用电子邮件地址查找联系人id:

String[] projection = {
    ContactsContract.Contacts.LOOKUP_KEY,
    ContactsContract.Contacts._ID
}

uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_LOOKUP_URI, Uri.encode(data)); //data = email address
cur = resolver.query(uri, projection, null, null, null);

if (cur != null){
    while (cur.moveToNext()){
        msg.set_contact(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)), cur.getLong(cur.getColumnIndex(ContactsContract.Contacts._ID)));
    }
}
上述代码的工作原理是,它发现电子邮件地址与电话上的联系人相关联

问题是:我想我得到的是原始电子邮件地址条目的_id,而不是整个联系人的_id。因为当我刷新存储的联系人id并将其与上面返回的内容进行比较时,它们不匹配,即使我已确认电子邮件与存储的联系人关联

以下是我如何查找存储的联系人:

String[] projection = {
    ContactsContract.Contacts.LOOKUP_KEY,
    ContactsContract.Contacts._ID
}

Uri uri = ContactsContract.Contacts.getLookupUri(contact_id, contact_lookup);

Cursor cur = resolver.query(cLookupUri, projection, null, null, null);
if(cur != null){
    while (cur.moveToNext()){
        msg.set_contact(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)), cur.getLong(cur.getColumnIndex(ContactsContract.Contacts._ID)));
    }
}
我做错了什么?基本上,我只想获得与收到的电子邮件地址相关联的任何联系人的联系人id

非常感谢您的帮助

试试这个:

查询Contacts contract.Contacts.Entity。在MIMETYPE=“vnd.android.cursor.dir/email_v2”上选择,DATA1=传入电子邮件地址

这将返回一个表,其中包含电子邮件地址与传入地址匹配的每个原始联系人的一行,但该行还将包含原始联系人的聚合联系人id。从中,您可以查询ContactsContract.Contacts以查找关键字。

尝试以下操作:

    public Long getContactIdByEmail(String email) {
        Uri uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_FILTER_URI, Uri.encode(email));
        String name = "?";
        long contactId =0;

        ContentResolver contentResolver = v.getContext().getContentResolver();
        Cursor contactLookup = contentResolver.query(uri, new String[] {ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME }, null, null, null);

        try {
            if (contactLookup != null && contactLookup.getCount() > 0) {

                contactLookup.moveToNext();
                name = contactLookup.getString(contactLookup.getColumnIndex( ContactsContract.Data.DISPLAY_NAME ));
                contactId = contactLookup.getLong(contactLookup.getColumnIndex(ContactsContract.Data.CONTACT_ID));

            }
        } finally {
            if (contactLookup != null) {
                contactLookup.close();
            }
        }

        return contactId;
    }
查询Contacts contract.Contacts.Entity。在MIMETYPE=“vnd.android.cursor.dir/email_v2”上选择,DATA1=传入电子邮件地址


这将返回一个表,其中包含电子邮件地址与传入地址匹配的每个原始联系人的一行,但该行还将包含原始联系人的聚合联系人id。从中,您可以查询ContactsContract.Contacts以查找关键字。

感谢您的回复。这让我找到了解决这个问题的正确途径。下面是我所做的:我使用的Uri没有错误,我只是在投影中抓取了错误的列。查看ContactsContract.CommonDataTypes.Email API ref显示,它根据您提到的MIMETYPE(vnd.android.cursor.item/Email_v2)进行过滤,并返回原始联系人数据以及聚合联系人数据。我只需要抓取联系人id字段而不是id字段。感谢您的帮助只是一个简短的提示,但我认为您可能应该使用预定义的常量contacts contract.commondatatypes.Email.CONTENT\u ITEM\u类型,而不是直接对mime类型进行硬编码。谢谢您的回复。这让我找到了解决这个问题的正确途径。下面是我所做的:我使用的Uri没有错误,我只是在投影中抓取了错误的列。查看ContactsContract.CommonDataTypes.Email API ref显示,它根据您提到的MIMETYPE(vnd.android.cursor.item/Email_v2)进行过滤,并返回原始联系人数据以及聚合联系人数据。我只需要抓取联系人id字段而不是id字段。感谢您的帮助只是一个简短的提示,但我认为您可能应该使用预定义的常量contacts contract.commondatatypes.Email.CONTENT\u ITEM\u类型,而不是直接硬编码mime类型。您是如何解决这个问题的?我不明白,你是怎么解决的?我不明白。
    public Long getContactIdByEmail(String email) {
        Uri uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_FILTER_URI, Uri.encode(email));
        String name = "?";
        long contactId =0;

        ContentResolver contentResolver = v.getContext().getContentResolver();
        Cursor contactLookup = contentResolver.query(uri, new String[] {ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME }, null, null, null);

        try {
            if (contactLookup != null && contactLookup.getCount() > 0) {

                contactLookup.moveToNext();
                name = contactLookup.getString(contactLookup.getColumnIndex( ContactsContract.Data.DISPLAY_NAME ));
                contactId = contactLookup.getLong(contactLookup.getColumnIndex(ContactsContract.Data.CONTACT_ID));

            }
        } finally {
            if (contactLookup != null) {
                contactLookup.close();
            }
        }

        return contactId;
    }