【问题标题】:Android ExifInterface throw FileNotFoundExceptionAndroid ExifInterface 抛出 FileNotFoundException
【发布时间】:2017-11-18 00:59:28
【问题描述】:

我正在尝试在 Android 中旋转位图并在 ImageView 中显示定向位图。

uri = Uri.parse(path)
try {
    Bitmap myBitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri);
    Bitmap orientedBitmap = ExifUtil.rotateBitmap(path, myBitmap);
    imageView.setImageBitmap(orientedBitmap);
} catch (IOException e) {
    e.printStackTrace();
}

并使用来自https://gist.github.com/9re/1990019 的 ExifUtil 我尝试旋转它

public class ExifUtil {
    public static Bitmap rotateBitmap(String src, Bitmap bitmap) {
        try {
            int orientation = getExifOrientation(src);

            if (orientation == ExifInterface.ORIENTATION_NORMAL) {
                return bitmap;
            }

            Matrix matrix = new Matrix();
            switch (orientation) {
                case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
                    matrix.setScale(-1, 1);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    matrix.setRotate(180);
                    break;
                case ExifInterface.ORIENTATION_FLIP_VERTICAL:
                    matrix.setRotate(180);
                    matrix.postScale(-1, 1);
                    break;
                case ExifInterface.ORIENTATION_TRANSPOSE:
                    matrix.setRotate(90);
                    matrix.postScale(-1, 1);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    matrix.setRotate(90);
                    break;
                case ExifInterface.ORIENTATION_TRANSVERSE:
                    matrix.setRotate(-90);
                    matrix.postScale(-1, 1);
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    matrix.setRotate(-90);
                    break;
                default:
                    return bitmap;
            }

            try {
                Bitmap oriented = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
                bitmap.recycle();
                return oriented;
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
                return bitmap;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } 

        return bitmap;
    }

    private static int getExifOrientation(String src) throws IOException {
        int orientation = ExifInterface.ORIENTATION_UNDEFINED;
        Log.e("src", src);
        try {
            ExifInterface exif = new ExifInterface(src);
            orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, orientation);
        } catch (SecurityException | IllegalArgumentException e) {
            e.printStackTrace();
        }

        return orientation;
    }
}

它给了我这个日志

11-17 17:03:20.265 3962-3962/it.package.path E/src: file:///storage/emulated/0/DCIM/image20171117_170310.jpg
11-17 17:03:30.781 3962-3962/it.package.path W/System.err: java.io.FileNotFoundException: file:/storage/emulated/0/DCIM/image20171117_170310.jpg (No such file or directory)
11-17 17:03:30.784 3962-3962/it.package.path W/System.err:     at java.io.FileInputStream.open(Native Method)
11-17 17:03:30.786 3962-3962/it.package.path W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:146)
11-17 17:03:30.787 3962-3962/it.package.path W/System.err:     at java.io.FileInputStream.<init>(FileInputStream.java:99)
11-17 17:03:30.789 3962-3962/it.package.path W/System.err:     at android.media.ExifInterface.<init>(ExifInterface.java:1106)
11-17 17:03:30.791 3962-3962/it.package.path W/System.err:     at it.package.path.ExifUtil.getExifOrientation(ExifUtil.java:68)
11-17 17:03:30.794 3962-3962/it.package.path W/System.err:     at it.package.path.ExifUtil.rotateBitmap(ExifUtil.java:13)
11-17 17:03:30.795 3962-3962/it.package.path W/System.err:     at it.package.path.PreviewFragment.onCreateView(PreviewFragment.java:57)
11-17 17:03:30.797 3962-3962/it.package.path W/System.err:     at android.app.Fragment.performCreateView(Fragment.java:2352)
11-17 17:03:30.799 3962-3962/it.package.path W/System.err:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:995)
11-17 17:03:30.800 3962-3962/it.package.path W/System.err:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171)
11-17 17:03:30.801 3962-3962/it.package.path W/System.err:     at android.app.BackStackRecord.run(BackStackRecord.java:815)
11-17 17:03:30.802 3962-3962/it.package.path W/System.err:     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1582)
11-17 17:03:30.804 3962-3962/it.package.path W/System.err:     at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483)
11-17 17:03:30.806 3962-3962/it.package.path W/System.err:     at android.os.Handler.handleCallback(Handler.java:751)
11-17 17:03:30.808 3962-3962/it.package.path W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-17 17:03:30.809 3962-3962/it.package.path W/System.err:     at android.os.Looper.loop(Looper.java:154)
11-17 17:03:30.811 3962-3962/it.package.path W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6692)
11-17 17:03:30.813 3962-3962/it.package.path W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
11-17 17:03:30.815 3962-3962/it.package.path W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
11-17 17:03:30.816 3962-3962/it.package.path W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)

为什么 ExifInterface exif = new ExifInterface(src);` 在缺少两个斜杠的文件路径上抛出 FileNotFoundException?

【问题讨论】:

  • 因为path 就是这样。 path 来自哪里?
  • @CommonsWare 我从相机结果中得到它。问题是 src = 路径,正如您从Log.e("src", src); src(和路径)=file:///storage/... 中看到的那样,FileNotFound 是针对file:/storage/... 的。为什么它会丢失 2 个斜线?
  • 真正的问题是:为什么要将UriString 形式传递给需要文件系统路径的方法?传递文件系统路径,而不是 Uri

标签: android bitmap exif


【解决方案1】:

从该路径中删除“file://”,以便您最终得到一个真实的文件系统路径

/storage/emulated/0/DCIM/image20171117_170310.jpg

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多