毕加索在某些三星设备上不显示图库中的图像
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);
}
在某些(全部?)三星设备(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);
}