Android:使用uri或filepath

时间:2016-11-24 16:13:51

标签: android path bitmapfactory

我的应用程序允许用户使用外部摄像头活动拍摄照片作为某些数据收集的一部分,并将生成的文件路径的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)

1 个答案:

答案 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的字符串表示),而是文件路径,文件路径没有方案。

如果您希望混合使用contentfile方案:

  • 抓住Uri(或者,最糟糕的情况下,重新解析字符串中的Uri
  • 使用ContentResolveropenInputStream()获取InputStream所代表内容的UriopenInputStream()支持contentfile {1}}计划)
  • 使用decodeStream()代替decodeFile()