Android 为什么我不能从联系人号码中获取个人资料pic的URI?

Android 为什么我不能从联系人号码中获取个人资料pic的URI?,android,imageview,uri,photo,contact,Android,Imageview,Uri,Photo,Contact,我有一个自定义来电屏幕,可以显示来电的姓名和电话号码。如果联系人在您自己的手机上设置了个人资料图片,则该图像应显示在我创建的ImageView中。任何不在手机上的号码都会显示Android图标 在测试代码之后,无论电话号码是否存储在手机模拟器上,我都会得到Android图标。以下是检索来电者的联系人照片(如果有)的代码: public Uri getPhotoUri(long contactId) { //contactId takes the phone number. Conten

我有一个自定义来电屏幕,可以显示来电的姓名和电话号码。如果联系人在您自己的手机上设置了个人资料图片,则该图像应显示在我创建的ImageView中。任何不在手机上的号码都会显示Android图标

在测试代码之后,无论电话号码是否存储在手机模拟器上,我都会得到Android图标。以下是检索来电者的联系人照片(如果有)的代码:

public Uri getPhotoUri(long contactId) { //contactId takes the phone number.

    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);
  }
此方法调用上述方法,并将图片指定给ImageView。问题是始终执行else语句:

IncomingCallListener.getIdgetID;是用于获取相应配置文件图片的实际电话号码

有人知道为什么u保持为空吗

注意:联系人图片存储在媒体库中。

试试这个

Uri uri = ContentUris.withAppendedId(
                    ContactsContract.Contacts.CONTENT_URI, longId);
            ContentResolver cr = getContentResolver();
            InputStream input = ContactsContract.Contacts
                    .openContactPhotoInputStream(cr, uri);
            if (input == null) {
                return null;
            } else
                return BitmapFactory.decodeStream(input);

使用ImageView的setImageBitmap方法。

您是否已将图像添加到Emulator中的联系人?您的目标SDK级别是什么?还是姜饼?在ICS lvl 14中,您有照片文件ID,可用于查找高分辨率图像,否则您几乎只能使用照片中存储的缩略图。@blackcrow获取名称和数字可以正常工作,但问题是此代码记录的u为空,因此,仅显示ic_启动器,该启动器假定用于未存储的联系人,或者没有为联系人设置配置文件图像。我可以向您保证,这是工作代码。尝试找出问题的确切位置。假设设置映像:qcbContactPic.setImageBitmapgetShowCPhotoIncomingCallListener.getIdgetID;可能是我使用的图片是jpeg而不是位图吗?我在上面的评论中使用了setImageBitmap。qcbContactPic是我的ImageView。从那里,没有图像显示出来。
Uri uri = ContentUris.withAppendedId(
                    ContactsContract.Contacts.CONTENT_URI, longId);
            ContentResolver cr = getContentResolver();
            InputStream input = ContactsContract.Contacts
                    .openContactPhotoInputStream(cr, uri);
            if (input == null) {
                return null;
            } else
                return BitmapFactory.decodeStream(input);