毕加索在某些三星设备上不显示图库中的图像

Picasso not showing Images from gallery on certain Samsung devices

在某些(全部?)三星设备(Galaxy S5、S3)上 Picasso 不显示图库中的图像。

这是代码:

File[] picFiles = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).listFiles();

File file = picFile[0]; 

我试过:

Picasso.with(getActivity()).load(Uri.fromFile(file)).into(imageView);

以及

Picasso.with(getActivity()).load("file://" + file.getAbsolutePath()).into(imageView);

无济于事。在所有非三星设备上,两个片段都可以正常工作:

文件的路径看起来与其他设备没有区别,示例:

/storage/emulated/0/Pictures/JPEG_20150706_112313_826588781.jpg

这可能是什么问题?

编辑:是的,我添加了 android.permission.READ_EXTERNAL_STORAGE。该文件存在并且图像在图库应用程序中可见。

编辑 2:这是毕加索的 stracktrace:

07-13 07:22:22.817  14648-14921/xy I/dalvikvm﹕ "Picasso-/storage/emulated/0/Pictures/JPEG_20150713_071858_-1853613631.jpg" prio=5 tid=51 RUNNABLE
07-13 07:22:22.817  14648-14921/xy I/dalvikvm﹕ at com.squareup.picasso.BitmapHunter.decodeStream(BitmapHunter.java:142)
07-13 07:22:22.817  14648-14921/xy I/dalvikvm﹕ at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:217)
07-13 07:22:22.817  14648-14921/xy I/dalvikvm﹕ at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159)
07-13 07:22:22.817  14648-14921/xy I/dalvikvm﹕ at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411)
07-13 07:22:23.167  14648-14918/xy﹕ "Picasso-/storage/emulated/0/Pictures/JPEG_20150713_071858_-1853613631.jpg" prio=5 tid=49 RUNNABLE
07-13 07:22:23.167  14648-14918/xy﹕ at com.squareup.picasso.BitmapHunter.transformResult(BitmapHunter.java:558)
07-13 07:22:23.167  14648-14918/xy﹕ at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:232)
07-13 07:22:23.167  14648-14918/xy﹕ at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159)
07-13 07:22:23.167  14648-14918/xy﹕ at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411)

似乎并没有真正揭示图像未显示的原因。

Picasso 版本是 2.5.2,我可以在装有 Android 4.4.4 的三星 S3 和装有 Android 5.0 的三星 S5 上重现错误。

UIL 正在加载相同的图像,所以它可能是 Picasso 中的错误,我可能会在他们的 github 上提交错误报告。

最后编辑: 问题实际上是一个 OOM 异常,我没有注意到,因为我过滤了 LogCat 错误的关键字。我现在很为自己感到羞愧。

picasso.load().fit().into() 

有效,正在显示图像。谢谢你的帮助。

您很可能正在加载非常大的图像,这可能会导致 OutOfMemoryError。您可以调整 Bitmap 的大小并保持纵横比。

在不将位图加载到内存的情况下获取位图的宽度和高度的示例:

File file = new File("/path/to/some/picture.jpg");
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file.getAbsolutePath(), options);
int width = options.outWidth;
int height = options.outHeight;

告诉 Picasso 调整图像大小以避免 OutOfMemoryError:

if (width > MAX_WIDTH || height > MAX_HEIGHT) {
    Picasso.with(context).load(uri)
        .resize(MAX_WIDTH, MAX_HEIGHT)
        .centerInside()
        .into(yourImageView);
}