我的应用程序允许用户使用外部摄像头活动拍摄照片作为某些数据收集的一部分,并将生成的文件路径的Uri.toString()存储在模型中供以后使用。
稍后在回收者视图中查看集合时,由于加载的图片大小,应用程序会变慢,因此我实施了Google的解决方案here,但我在堆栈中获得了FileNotFoundExceptions
跟踪,图像未加载。视图的其余部分加载正常,应用程序不会崩溃。
如上所述,uriString
是一个格式为content:foo/bar
的字符串。我尝试过包括。
file.getabsolutePath()
而不是uri.toString
。这会将uriString格式更改为file:/foo/bar
,但仍无法正常工作Uri.parse(uriString).getPath()
uriString
创建一个新的File对象,并从中调用getAbsolutePath()
和getPath()
。要清楚,调用imageView.setImageURI(Uri.parse(this.item.getPhotoURI()));
绝对有效。所以文件存在,uriString可以由Android解释。有问题的功能如下。我的堆栈跟踪在下面。
private Bitmap decodeSampledBitmapFromFile(String uriString, int reqWidth, int reqHeight)
{
// First we do this just to check dimensions (apparently)
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(uriString, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// And then return with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(uriString, options);
}
我的堆栈跟踪:
11-24 16:10:57.762 17199-17199/uk.mrshll.matt.accountabilityscrapbook E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: file:/storage/emulated/0/Android/data/uk.mrshll.matt.accountabilityscrapbook/files/Pictures/JPEG_20161124_160913_-1155698030.jpg: open failed: ENOENT (No such file or directory)
答案 0 :(得分:0)
如上所述,uriString是一个内容格式的字符串:foo / bar。
不是根据你的错误。您的错误表明您尝试将"file:/storage/emulated/0/Android/data/uk.mrshll.matt.accountabilityscrapbook/files/Pictures/JPEG_20161124_160913_-1155698030.jpg"
传递给decodeFile()
。该字符串上显示的方案为file
,而不是content
。更重要的是,decodeFile()
不接受Uri
(或Uri
的字符串表示),而是文件路径,文件路径没有方案。
如果您希望混合使用content
和file
方案:
Uri
(或者,最糟糕的情况下,重新解析字符串中的Uri
)ContentResolver
和openInputStream()
获取InputStream
所代表内容的Uri
(openInputStream()
支持content
和file
{1}}计划)decodeStream()
代替decodeFile()