使用 LOOKUP_URI 在 Android (API 8) 中获取联系人照片

Posted

技术标签:

【中文标题】使用 LOOKUP_URI 在 Android (API 8) 中获取联系人照片【英文标题】:Get contact photo in Android (API 8) using LOOKUP_URI 【发布时间】:2012-04-30 04:47:19 【问题描述】:

我正在尝试使用其查找 URI 获取联系人图像。 我使用此代码成功获得了 DISPLAY_NAME:

Cursor c = context.getContentResolver().query(contactLookupUri,
                new String[]  ContactsContract.Contacts.DISPLAY_NAME , null,
                null, null);

但我没有找到获取照片的方法。 Photo.PHOTO 选项对我正在使用的 API 无效,并且尝试使用 inputStream 获取它也不起作用(也许我在那里做错了):

InputStream input = ContactsContract.Contacts
                    .openContactPhotoInputStream(context.getContentResolver(),
                            contactUri);

谢谢, 约尔

【问题讨论】:

【参考方案1】:

最终我通过获取联系人 ID 并使用 inputStream 解决了这个问题:

public static Uri getContactLookupUri(String contactLookupKey) 
        return Uri.withAppendedPath(
                ContactsContract.Contacts.CONTENT_LOOKUP_URI, contactLookupKey);
    

public static Bitmap getContactImage(Context context, String contactLookupKey) 

    long contactId;

    try 
        Uri contactLookupUri = getContactLookupUri(contactLookupKey);
        Cursor c = context.getContentResolver().query(contactLookupUri,
                new String[]  ContactsContract.Contacts._ID , null, null,
                null);
        try 
            if (c == null || c.moveToFirst() == false) 
                return null;
            
            contactId = c.getLong(0);
         finally 
            c.close();
        

     catch (Exception e) 
        e.printStackTrace();
        return null;
    

    Uri contactUri = ContentUris.withAppendedId(
            ContactsContract.Contacts.CONTENT_URI, contactId);
    InputStream input = ContactsContract.Contacts
            .openContactPhotoInputStream(context.getContentResolver(),
                    contactUri);

    if (input != null) 
        return BitmapFactory.decodeStream(input);
     else 
        return null;
    

【讨论】:

lookupKey 的解释可以在这里找到:developer.android.com/resources/articles/contacts.html【参考方案2】:

下面的函数返回你的contact_id的图片uri

/**
 * @return the photo URI
 */
public Uri getPhotoUri() 
    try 
        Cursor cur = this.ctx.getContentResolver().query(
                ContactsContract.Data.CONTENT_URI,
                null,
                ContactsContract.Data.CONTACT_ID + "=" + this.getId() + " AND "
                        + ContactsContract.Data.MIMETYPE + "='"
                        + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE + "'", null,
                null);
        if (cur != null) 
            if (!cur.moveToFirst()) 
                return null; // no photo
            
         else 
            return null; // error in cursor process
        
     catch (Exception e) 
        e.printStackTrace();
        return null;
    
    Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long
            .parseLong(getId()));
    return Uri.withAppendedPath(person, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);

也可以参考这个LINK

【讨论】:

您好 Agarwal,感谢您的回答,但我没有联系人 ID,我只有 lookupKey。而且我实际上不理解您的解决方案,因为您似乎根本没有使用查询结果。 @yoel 你能发布你的来源吗?我不明白“Uri contactLookupUri = getContactLookupUri(contactLookupKey);”

以上是关于使用 LOOKUP_URI 在 Android (API 8) 中获取联系人照片的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 12 中使用 WorkManager

Android Handler使用

何时在 Android 中使用 RxJava,何时使用 Android 架构组件中的 LiveData?

如何在 android 应用程序中使用 OSM 地图。?有啥教程可以学习在android中使用OSM吗?

在 xml (android:, app:, @.., ...) 上使用 android 前缀

Android:如何在 Android 中使用 tensorflow lite 扩展图像的维度