Android:尝试从Uri获取图像时出现FileNotFoundException

时间:2016-05-02 02:18:23

标签: java android bitmap uri filenotfoundexception

我正在尝试获取图像的宽度和高度,以便在显示它之前将其重新调整大小。我的方法接收到图像的uri,但在尝试使用BitmapFactory解码时我总是得到FileNotFoundException。

以下是我的代码示例:

    Uri myUri;

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(new File(myUri.getPath()).getAbsolutePath(), options);

    int imageHeight = options.outHeight;
    int imageWidth = options.outWidth;

Decode File返回会在此处抛出FileNotFoundException。但是,我仍然可以使用uri显示图像而不使用位图工厂:

        Uri myUri;

        Bitmap myBitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), myUri);

此代码的问题在于,使用大图像时返回的位图可能会导致OutofMemoryError。

当我调试我的Uri时,我得到了这个:

  

内容://com.android.providers.media.documents/document/image%3A20472

更新||这是工作代码

    Uri myUri;

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;

    // This is the part that changed
    InputStream inputStream = context.getApplicationContext().getContentResolver().openInputStream(myUri);
    BitmapFactory.decodeStream(inputStream,new Rect(),options);

    int imageHeight = options.outHeight;
    int imageWidth = options.outWidth;

所有这一切当然都包含在try / catch中。

2 个答案:

答案 0 :(得分:0)

在玩了一段时间之后,我认为问题可能是图像文件确实不存在。

如果您尝试访问计算机上的本地文件,该文件将不会位于应用程序实际运行的Android沙箱中。您需要将其作为资源添加到应用程序,然后将其作为资源而不是文件进行访问。

如果您尝试访问Web图像,则需要先下载它。网络图像的绝对路径' http://example.com/example.jpg'将是' /example.jpg',当你试图打开它时,它不会对你有好处。

答案 1 :(得分:0)

使用decodeStream代替decodeFile

使用getContentResolver().openInputStream(myUri)打开信息流。