Android ExiFinInterface抛出FileNotFoundException
我正在尝试在Android中旋转位图,并在ImageView中显示定向位图Android ExiFinInterface抛出FileNotFoundException,android,bitmap,exif,Android,Bitmap,Exif,我正在尝试在Android中旋转位图,并在ImageView中显示定向位图 uri = Uri.parse(path) try { Bitmap myBitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uri); Bitmap orientedBitmap = ExifUtil.rotateBitmap(path, myBitmap); imageView.setIm
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();
}
然后用一个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)
11-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(没有这样的文件或目录)
11-17 17:03:30.784 3962-3962/it.package.path W/System.err:at java.io.FileInputStream.open(本机方法)
11-17 17:03:30.786 3962-3962/it.package.path W/System.err:at java.io.FileInputStream.(FileInputStream.java:146)
11-17 17:03:30.787 3962-3962/it.package.path W/System.err:at java.io.FileInputStream.(FileInputStream.java:99)
11-17 17:03:30.789 3962-3962/it.package.path W/System.err:at-android.media.ExifInterface.(ExifInterface.java:1106)
11-17 17:03:30.791 3962-3962/it.package.path W/System.err:at it.package.path.ExifUtil.getExiforOrientation(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.8013962-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.8113962-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(本机方法)
11-17 17:03:30.815 3962-3962/it.package.path W/System.err:在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468)
11-17 17:03:30.816 3962-3962/it.package.path W/System.err:com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358)
为什么ExifInterface exif=新ExifInterface(src);`在缺少两个斜杠的文件路径上抛出FileNotFoundException?从该路径中删除“file://”,从而得到一个真正的文件系统路径
/storage/emulated/0/DCIM/image20171117_170310.jpg
从该路径中删除“file://”,这样就得到了一个真正的文件系统路径
/storage/emulated/0/DCIM/image20171117_170310.jpg
因为这就是路径。
path
从哪里来?@commonware我从一个摄像头结果中得到它。问题是src=path,正如您可以从Log.e(“src”,src)中看到的那样代码>src(和路径)=file:///storage/...
而FileNotFound用于文件:/storage/…
。为什么会丢失两个斜杠?真正的问题是:为什么要将Uri的String
形式传递给需要文件系统路径的方法?传递文件系统路径,而不是Uri
。因为这就是路径。path
从哪里来?@commonware我从一个摄像头结果中得到它。问题是src=path,正如您可以从Log.e(“src”,src)中看到的那样代码>src(和路径)=file:///storage/...
而FileNotFound用于文件:/storage/…
。为什么会丢失两个斜杠?真正的问题是:为什么要将Uri的String
形式传递给需要文件系统路径的方法?传递文件系统路径,而不是Uri
。