Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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从数据中获取联系人照片。电子邮件查询_Android_Email_Contacts_Photo - Fatal编程技术网

Android从数据中获取联系人照片。电子邮件查询

Android从数据中获取联系人照片。电子邮件查询,android,email,contacts,photo,Android,Email,Contacts,Photo,我正在制作一个自动完成字段,通过显示姓名和电子邮件查询联系人。当某人在过滤后单击所需联系人时,该联系人将与他的电子邮件一起添加到列表中,显示姓名和图片(如果有) 到目前为止,我已经设法做了一切,除了使照片出现。下面是我如何运行查询以获取电子邮件、显示名称、ID和照片ID return mContent.query(Email.CONTENT_URI, PROJECTION, filter, null, null); 其中,投影为: PROJECTION =

我正在制作一个自动完成字段,通过显示姓名和电子邮件查询联系人。当某人在过滤后单击所需联系人时,该联系人将与他的电子邮件一起添加到列表中,显示姓名和图片(如果有)

到目前为止,我已经设法做了一切,除了使照片出现。下面是我如何运行查询以获取电子邮件、显示名称、ID和照片ID

    return mContent.query(Email.CONTENT_URI,
              PROJECTION, filter, null, null);
其中,投影为:

 PROJECTION = new String[] {ContactsContract.Contacts._ID,
              ContactsContract.Contacts.DISPLAY_NAME,
              ContactsContract.Contacts.PHOTO_ID,
                Email.DATA
            };
这个做了我需要的并返回了所有的数据。但我在调试这个问题时注意到的一点是,联系人id与针对特定显示名称的Contacts contract.Contacts.CONTENT\u URI运行查询时不同

例如,我运行的测试通过运行contacts.CONTENT_URI获取所有联系人,并为我提供了一个图像和Id为152的联系人。但是,对Email.CONTENT_URI的查询为同一联系人(具有相同的显示名称和电子邮件地址)提供了452的id。因此,当我尝试为包含ID452的内容uri获取照片时,它返回该照片不存在,但是如果我尝试为152获取照片,它将非常有效

是什么导致了这个问题?如何获取正确的用户ID?是否有任何关系查询,我可以运行以获取联系人ID,或者通过此查询获得联系人ID的正确方法

多谢各位

编辑

我在旧代码中找到了这个。可能对任何人都有帮助

因此,完整的查询:

String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID,
            Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID };

                String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME
                        + " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, "
                        + ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE";
                String filter = Email.DATA + " NOT LIKE '' ) GROUP BY ( " + Email.DATA;
那么它


getContentResolver().query(Email.CONTENT\u URI、投影、过滤器、null、顺序)

您应该在查询中使用原始联系人ID。例如,可以有两个不同的联系人,即一个联系人ID可以有不同的原始联系人ID。

也许你可以在示例中查看这篇博文,他们查询所有联系人、电子邮件地址和联系人照片

当您想要访问联系人的照片时,需要指定联系人照片URI,例如使用以下方法:

public Uri getContactPhotoUri(long contactId) {
    Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
    photoUri = Uri.withAppendedPath(photoUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    return photoUri;
}
但对于contactId,您必须使用:

String id = ContactsContract.CommonDataKinds.Photo.CONTACT_ID;
long contactId = Long.parseLong(id);
请注意,一个常见错误是使用
ContactsContract.Contacts.\u ID
代替
ContactsContract.commondatatypes.Photo.CONTACT\u ID

我希望这能对您有所帮助。

最好的代码是

Uri photoUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Id);

    Bitmap photoBitmap;
    ContentResolver cr = getContentResolver();
    InputStream is = ContactsContract.Contacts.openContactPhotoInputStream(cr, photoUri);

    photoBitmap = BitmapFactory.decodeStream(is);

它适用于所有人

我尝试使用原始联系人ID,但它给出的结果与此相同。。。相同的id。所以我假设表包含原始id,查询将其返回给我。但是当我为联系人照片构建uri时,我仍然得到与以前相同的uri和相同的结果。。。据我所知,此查询执行某种类型的join db操作,因为电子邮件表不包含某些参数。它实际上是ContactsContract.Contacts.\u要使用的ID。我没有得到“ID”部分,并且您已将其解析为long(这将崩溃,因为它不长)。