【问题标题】:Android getting contacts photo from data.Email queryAndroid 从 data.Email 查询中获取联系人照片
【发布时间】:2011-03-16 21:56:00
【问题描述】:

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

到目前为止,除了让照片出现之外,我已经设法做所有事情。这是我运行查询以获取电子邮件、显示名称、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 与针对特定显示名称的 ContactsContract.Contacts.CONTENT_URI 运行查询不同。

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

是什么导致了这个问题?如何获得正确的用户 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_URI, PROJECTION, filter, null, order);

【问题讨论】:

    标签: android email contacts photo


    【解决方案1】:

    当你想访问一个联系人的照片时,你需要指定联系人照片的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._ID 而不是ContactsContract.CommonDataKinds.Photo.CONTACT_ID

    希望对你有帮助。

    【讨论】:

    • 实际使用的是ContactsContract.Contacts._ID。
    • 我没有得到“id”的部分,并且您已将其解析为 long(因为它不是很长,所以会崩溃)。
    【解决方案2】:

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

    【讨论】:

    • 我尝试使用 RAW_CONTACT_ID,但它给了我与这个相同的结果......相同的 id。所以我假设该表包含原始 id 并且查询将其返回给我。但是当我为联系人照片构建 uri 时,我仍然得到与以前相同的 uri 和相同的结果......据我所知,这个查询执行了某种 join db 操作,因为电子邮件表不包含其中的一些参数。
    【解决方案3】:

    也许您可以在示例中查看此博客文章,他们查询所有联系人、电子邮件地址和联系人照片 http://blog.app-solut.com/2011/03/working-with-the-contactscontract-to-query-contacts-in-android/

    【讨论】:

      【解决方案4】:

      最好的代码是

      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);
      

      它适用于所有人

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-14
        • 2015-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多