如何通过 android 2.3.6 中的联系人提供者获取联系人照片?

Posted

技术标签:

【中文标题】如何通过 android 2.3.6 中的联系人提供者获取联系人照片?【英文标题】:How do you get a contact photo through the contact provider in android 2.3.6? 【发布时间】:2012-12-15 15:33:53 【问题描述】:

我有这个适用于 android 4 的版本(String email 是一个 gmail 地址):

private Uri getPhotoUriFromEmail(String email) 
    Uri u = null;
    String[] projection =  ContactsContract.CommonDataKinds.Email.PHOTO_URI ;
    String photoUri;
    ContentResolver cr = context.getContentResolver();
    Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, projection,
            ContactsContract.CommonDataKinds.Email.ADDRESS + " = ?", 
            new String[]email, null);
    if (emailCur.moveToNext())  
        photoUri = emailCur.getString(
                emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.PHOTO_URI));
        u = Uri.parse(photoUri);
    
    return u;

它的 2.3.6 版本是什么? (当我将 API 8 设置为我的最小 API 支持时,android SDK 也不应该警告我使用 API 11 吗?因为它没有......)

【问题讨论】:

【参考方案1】:

您可以通过这种方式不使用ContactsContract.CommonDataKinds.Email.PHOTO_URI 获取联系人照片uri:

private Uri getPhotoUriFromEmail(String email) 
    Uri u = null;
    String[] projection =  ContactsContract.CommonDataKinds.Photo.CONTACT_ID ;
    String photoUri;
    ContentResolver cr = getContentResolver();
    Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
            projection,
            ContactsContract.CommonDataKinds.Email.ADDRESS + " = ?",
            new String[]email, null);
    if (emailCur.moveToNext()) 
        int columnIndex = emailCur.getColumnIndex(
                              ContactsContract.CommonDataKinds.Photo.CONTACT_ID);
        long contactId = emailCur.getLong(columnIndex);

        u = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, 
                                       contactId);
        u = Uri.withAppendedPath(u, 
                                ContactsContract.Contacts.Photo.CONTENT_DIRECTORY);
    
    return u;

或者,您可以通过这种方式使用ContactsContract.Contacts .openContactPhotoInputStream(ContentResolver, Uri) 方法获取照片流:

private InputStream getPhotoInputStreamFromEmail(String email) 
    Uri u = null;
    String[] projection =  ContactsContract.CommonDataKinds.Photo.CONTACT_ID ;
    String photoUri;
    ContentResolver cr = getContentResolver();
    Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
            projection,
            ContactsContract.CommonDataKinds.Email.ADDRESS + " = ?",
            new String[]email, null);
    if (emailCur.moveToNext()) 
        int columnIndex = emailCur.getColumnIndex(
                ContactsContract.CommonDataKinds.Photo.CONTACT_ID);
        long contactId = emailCur.getLong(columnIndex);

        u = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
                contactId);
        return ContactsContract.Contacts.openContactPhotoInputStream(cr, u);
    
    return null;

【讨论】:

谢谢..你拯救了我的一天:)

以上是关于如何通过 android 2.3.6 中的联系人提供者获取联系人照片?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过长按我的 Android 应用程序的联系人列表中的联系人添加附加选项?

通过聊天 (XMPP) Android 发送日历事件

Android 3.0 - 如何通过 ContactsContract 检索所有联系人

如何从android中的json对象呈现和选择联系人?

如何从android中的单个查询中获取联系人的名字,姓氏,电子邮件ID

在 Android 上通过电话号码获取联系人