Java 毕加索加载照片缩略图URI,但不加载照片URI

Java 毕加索加载照片缩略图URI,但不加载照片URI,java,android,android-contacts,picasso,Java,Android,Android Contacts,Picasso,在我遇到这个障碍之前,用毕加索加载图像似乎很容易。不知道为什么!如果联系人只有缩略图,或者如果我特别要求照片缩略图,我可以通过照片URI从联系人加载照片 @Override public void bindView(View view, Context context, Cursor cursor) { ImageView icon = (ImageView)view.findViewById(R.id.ContactImage); String

在我遇到这个障碍之前,用毕加索加载图像似乎很容易。不知道为什么!如果联系人只有缩略图,或者如果我特别要求照片缩略图,我可以通过照片URI从联系人加载照片

    @Override
    public void bindView(View view, Context context, Cursor cursor) {

        ImageView icon = (ImageView)view.findViewById(R.id.ContactImage);
        String photoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI));

        if (photoUri == null) {
            icon.setImageDrawable(null);
        } else {
            Picasso.with(context).load(photoUri).into(icon);
        }
    }
值得一提的是:如果我使用毕加索.with(context).load(photoUri).placeholder(R.drawable.placeholder).error(R.drawable.error).into(icon)然后我在每个具有高分辨率图像的联系人的位置上看到占位符图像。我从来没有看到过“错误”图片。如果我恢复到只使用
icon.setImageURI(Uri.parse(photoUri))然后我再次看到高分辨率的联系人图像。(但我没有时髦的异步缓存图片加载器!)

更新:多亏了@copolii和他下面的答案,以下内容现在可以完美地与毕加索2.1.1配合使用:

@Override
public void bindView(View view, Context context, Cursor cursor) {

    Long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
    Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, id);
    String photoUri = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_URI));

    ImageView icon = (ImageView)view.findViewById(R.id.ContactImage);

    if (photoUri == null) {
        icon.setImageDrawable(null);
    } else {
        Picasso
            .with(context)
            .load(contactUri)
            .into(icon);
    }

}

这将加载高分辨率照片,如果有,则显示低分辨率照片,如果没有联系人的照片集,则将其设置为空白/空。

是否尝试使用
联系人uri

openContactPhotoInputStream
中的最后一个布尔参数承诺,如果有高分辨率照片,它将为您提供高分辨率照片

不要使用
照片uri
而是使用
联系人uri
联系人查找uri

更新 既然问题已经回答了,我想我会在这里发布相关细节: 此处发布了一个小型测试应用程序(您需要Android Studio):

如果同时设置了
占位符
错误
图标,则会为没有图片的联系人显示
错误
图标。我建议将社交面孔设置为你的占位符和无错误图标。这样,如果联系人没有照片,您的占位符将保持打开状态

如果您想区分这两种情况,请在选择错误图标时牢记以上内容(即不要使用红色大OMFG错误指示器)

--以前的内容--

如果有帮助,请告诉我

我为联系人照片加载做了工作,除非我遗漏了什么,否则您应该自动获得高分辨率图片(API 14+):

if (SDK_INT < ICE_CREAM_SANDWICH) {
  return openContactPhotoInputStream(contentResolver, uri);
} else {
  return openContactPhotoInputStream(contentResolver, uri, true);
}
if(SDK\u INT
openContactPhotoInputStream似乎不喜欢照片URI

如果URI是可区分的,我也可以轻松添加对PHOTO_URI的支持(不过我必须先了解如何加载它)。我已经在确定给定的uri是联系人照片uri还是联系人查找uri(较旧的android版本不喜欢将查找uri输入到
openContactPhotoInputStream
,因此我必须在将其传递到
openContactPhotoInputStream
之前将查找uri解引用到联系人uri中)


我希望这会有所帮助。

您是否尝试过使用
联系人uri

openContactPhotoInputStream
中的最后一个布尔参数承诺,如果有高分辨率照片,它将为您提供高分辨率照片

不要使用
照片uri
而是使用
联系人uri
联系人查找uri

更新 既然问题已经回答了,我想我会在这里发布相关细节: 此处发布了一个小型测试应用程序(您需要Android Studio):

如果同时设置了
占位符
错误
图标,则会为没有图片的联系人显示
错误
图标。我建议将社交面孔设置为你的占位符和无错误图标。这样,如果联系人没有照片,您的占位符将保持打开状态

如果您想区分这两种情况,请在选择错误图标时牢记以上内容(即不要使用红色大OMFG错误指示器)

--以前的内容--

如果有帮助,请告诉我

我为联系人照片加载做了工作,除非我遗漏了什么,否则您应该自动获得高分辨率图片(API 14+):

if (SDK_INT < ICE_CREAM_SANDWICH) {
  return openContactPhotoInputStream(contentResolver, uri);
} else {
  return openContactPhotoInputStream(contentResolver, uri, true);
}
if(SDK\u INT
openContactPhotoInputStream似乎不喜欢照片URI

如果URI是可区分的,我也可以轻松添加对PHOTO_URI的支持(不过我必须先了解如何加载它)。我已经在确定给定的uri是联系人照片uri还是联系人查找uri(较旧的android版本不喜欢将查找uri输入到
openContactPhotoInputStream
,因此我必须在将其传递到
openContactPhotoInputStream
之前将查找uri解引用到联系人uri中)


我希望这能有所帮助。

当我使用照片URI,但联系人没有高分辨率照片时,它会返回URI,如
content://com.android.contacts/contacts/38/photo
,它工作正常,显示良好。但是如果他们有一张高分辨率的照片,它会返回一个类似
content://com.android.contacts/display_photo/5
,这时我什么也得不到,或者,如果设置了占位符,那么占位符也得不到。更清楚的是,如果我使用photo\u THUMBNAIL\u URI,即使我正在运行KitKat,我也只能得到他们照片的低分辨率版本。绝对高于ICS。好的,谢谢。这是有用的信息。似乎
openContactPhotoInputStream
无法像
content://com.android.contacts/display_photo/5
我将在一个小测试应用程序中尝试一下,看看缺少什么。您是否尝试过使用
联系人uri
openContactPhotoInputStream
中的最后一个布尔参数承诺,如果有高分辨率照片,它将为您提供高分辨率照片。不要使用
照片uri
使用
联系人uri