如何获取联系人头像URI

10
我正在使用Android联系人ContentProvider工作。我有一个“电话号码”,我需要获取与此电话号码相关联的联系人的“照片”的“URI”。我该怎么做?
我知道我可以获取照片的原始数据并构建一个InputStream,但我不想要input stream,我需要URI。
编辑:最初,我使用以下代码获取联系人信息。
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNo));
    Cursor cursor = context.getContentResolver().query(uri, details, null, null, null);
5个回答

12

使用以下代码可通过电话号码获取联系人ID:

import android.provider.ContactsContract.PhoneLookup;

public String fetchContactIdFromPhoneNumber(String phoneNumber) {
    Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
        Uri.encode(phoneNumber));
    Cursor cursor = this.getContentResolver().query(uri,
        new String[] { PhoneLookup.DISPLAY_NAME, PhoneLookup._ID },
        null, null, null);

    String contactId = "";

    if (cursor.moveToFirst()) {
        do {
        contactId = cursor.getString(cursor
            .getColumnIndex(PhoneLookup._ID));
        } while (cursor.moveToNext());
    }

    return contactId;
  }

使用获取到的联系人ID来获取联系人头像的URI。使用以下代码获取头像URI:

import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;

public Uri getPhotoUri(long contactId) {
    ContentResolver contentResolver = getContentResolver();

    try {
        Cursor cursor = contentResolver
            .query(ContactsContract.Data.CONTENT_URI,
                null,
                ContactsContract.Data.CONTACT_ID
                    + "="
                    + contactId
                    + " AND "

                    + ContactsContract.Data.MIMETYPE
                    + "='"
                    + ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE
                    + "'", null, null);

        if (cursor != null) {
        if (!cursor.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, contactId);
    return Uri.withAppendedPath(person,
        ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
  }

希望这能帮到你。


4
完成操作后不要忘记关闭光标,否则会出现内存泄漏。 - pm_labs
2
请确保在您应用的清单中包含READ_CONTACTS权限。 - PeteH
6
这个 getPhotoUri 程序在任何可能的方式中都是完全错误的... 不要使用它... 你还需要检查 uri 的存在性.. 回答应该被删除.. 如果你需要 uri,从内容提供程序中读取 PHOTO_URI 或 PHOTO_THUMBNAIL_URI 以获取有效的 URI! - xnagyg
1
@xnagyg 很容易说出什么不应该做,什么应该做,但没有任何示例是不够的。请提供您的解决方案。 - Udi Oshi

9

这个解决方案演示了如何从用户联系人获取图片并在ImageView中显示。

ImageView profile  = (ImageView)findViewById(R.id.imageView1);                 
Uri my_contact_Uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, String.valueOf(Contact_Id));
InputStream photo_stream = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(),my_contact_Uri);            
BufferedInputStream buf =new BufferedInputStream(photo_stream);
Bitmap my_btmp = BitmapFactory.decodeStream(buf);
profile.setImageBitmap(my_btmp);

代码中缺少 "buf",应为 BufferedInputStream buf =new BufferedInputStream(photo_stream); - pm_labs
4
此外,你可以直接将 Uri 设置给 imageView(使用 imageView.setImageURI(uri)),而无需自己转换为 Bitmap。 - pm_labs
@paul_sns 把它存储到数据库中怎么样?我可以使用URI还是位图链接? - ajdeguzman

5
这是来自Android文档的代码:ContactsContract.Contacts.Photo
Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId);
return Uri.withAppendedPath(contactUri, ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);

2

您可以使用以下代码获取NUMBERPHOTO_URI,也可以使用_ID

 public static String getContactPhoto(Context context, String phoneNumber) {
    ContentResolver cr = context.getContentResolver();
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    Cursor cursor = cr.query(uri, new String[]{ContactsContract.PhoneLookup.PHOTO_URI}, null, null, null);
    if (cursor == null) {
        return null;
    }
    String contactImage= null;
    if (cursor.moveToFirst()) {
        contactImage= cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.PHOTO_URI));
    }

    if (!cursor.isClosed()) {
        cursor.close();
    }
    return contactImage;
}

0
    final boolean IS_HONEYCOMB = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
    String phoneNumber = "+1 416 385 7805";
    ContentResolver contentResolver = context.getContentResolver();
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
    String[] projection = new String[] {
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.LOOKUP_KEY,
            IS_HONEYCOMB ? ContactsContract.Contacts.PHOTO_THUMBNAIL_URI : ContactsContract.Contacts._ID,
            };
    Cursor cursor =
            contentResolver.query(
                    uri,
                    projection,
                    null,
                    null,
                    null);
    if (cursor != null && cursor.moveToNext()) {
        long contactId = cursor.getLong(0);
        String lookupKey = cursor.getString(1);
        String thumbnailUri = cursor.getString(2);           
        cursor.close();
    }

现在,如果SDK是蜂巢或更高版本,则可以获取联系人的缩略图URI。 或者您可以构建类似于以下内容的查找URI:

Uri uri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey);

顺便提一下,如果您已经知道联系人ID和/或查找键,则可以从字符串构造Uri:

查找: content://com.android.contacts/contacts/lookup/{查找键}/{联系人ID} 缩略图: content://com.android.contacts/contacts/{联系人ID}/photo

因此最好缓存这些值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接