【问题标题】:FileNotFoundException when Using ExifInterface使用 ExifInterface 时出现 FileNotFoundException
【发布时间】:2018-03-21 13:41:35
【问题描述】:

我一直在将图像上传到 FirebaseStorage,但在显示它们时它们的显示方式通常是错误的。我发现了 ExifInterface 可以确定图像的方向并在必要时旋转和翻转它。

从手机的图库区域中选择图像时,出现此错误。

我可以从图库中选择我手机上的图像,它可以显示在页面上。

URI地址和数据的区别是一个/

Data.getData() address : content://media/external/images/media/53331

uri.toString() address: content:/media/external/images/media/53331

我使用 uri 地址作为图像的绝对路径,以便在必要时能够旋转它。我将此值传递给另一个名为modifyOrientation 的方法,然后旋转它。一旦它被传递到方法中,它就会到达该行

ExifInterface ei = new ExifInterface(image_absolute_path);

然后由于找不到文件而返回到catch。

以下是我得到的整个错误以及我的所有代码。我该如何解决我遇到的这个问题。因此,当我将 URI 传递到下一个方法时,它实际上具有正确的地址。

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        final FirebaseUser user = auth.getCurrentUser();

        if (requestCode == GALLERY_INTENT && resultCode == RESULT_OK)
        {
            progressDialog = new ProgressDialog(getActivity());
            progressDialog.setMessage("Displaying Image...");
            progressDialog.show();

            //imageUri = data.getData();
            //Picasso.get().load(imageUri).into(profileImage);


            final Uri uri = data.getData();


            File file = new File(uri.toString());
            file.getAbsolutePath();

            progressDialog.dismiss();
            try
            {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
                modifyOrientation(bitmap,file.getAbsolutePath());
                profileImage.setImageBitmap(bitmap);
            }
            catch(IOException e)
            {
                e.getStackTrace();
            }
        }
    }

    public static Bitmap modifyOrientation(Bitmap bitmap, String image_absolute_path) throws IOException {
        ExifInterface ei = new ExifInterface(image_absolute_path);
        int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                return rotate(bitmap, 90);

            case ExifInterface.ORIENTATION_ROTATE_180:
                return rotate(bitmap, 180);

            case ExifInterface.ORIENTATION_ROTATE_270:
                return rotate(bitmap, 270);

            case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
                return flip(bitmap, true, false);

            case ExifInterface.ORIENTATION_FLIP_VERTICAL:
                return flip(bitmap, false, true);

            default:
                return bitmap;
        }
    }

    public static Bitmap rotate(Bitmap bitmap, float degrees) {
        Matrix matrix = new Matrix();
        matrix.postRotate(degrees);
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    }

    public static Bitmap flip(Bitmap bitmap, boolean horizontal, boolean vertical) {
        Matrix matrix = new Matrix();
        matrix.preScale(horizontal ? -1 : 1, vertical ? -1 : 1);
        return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    }

【问题讨论】:

    标签: java android rotation exif filenotfoundexception


    【解决方案1】:

    Uri 不是 File。

    步骤一:删除File file = new File(uri.toString());

    第 2 步:确保您使用的是the Support Library edition of ExifInterface

    第 3 步:在您的 Activity 上致电 getContentResolver() 以获取 ContentResolver

    步骤#4:在ContentResolver上调用openInputStream(),传入Uri,在Uri指向的内容上获得InputStream

    第 5 步:将 InputStream 传递给 the ExifInterface constructor

    第 6 步:使用当前的 ExifInterface 来确定图像方向

    第 7 步:一旦一切正常,将所有这些 I/O 移至后台线程

    【讨论】:

    • 我的错误是我使用将 Uri 传递给 ExifInterface 构造函数。从Uri 创建一个 InputStream 是解决方案。 contentResolver.openInputStream(uri)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多