为什么我会收到 Android 的 ExifInterface 的文件未找到错误?
Why am I getting File not found error for ExifInterface with Android?
我正在使用 Firebase 为我的 android 应用存储图像。然后,这些图像会以回收者视图出现在我的应用程序中。这一切都很好,但是,某些图像出现在侧面。特别是那些用 Galaxy S7 拍摄的照片。
我知道我需要从图像中获取 exif 信息,但是当我尝试时出现找不到文件的错误,我该怎么办?
private int getImageOrientation(String imagePath){
int rotate = 0;
try {
File imageFile = new File(imagePath);
ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
} catch (Exception e) {
e.printStackTrace();
}
return rotate;
}
W/System.err: java.io.FileNotFoundException: /https:/firebasestorage.googleapis.com/v0/b/pickit-d193d.appspot.com/o/posts%2Ff12e73ad-9bc5-4485-90e5-927dbf8539a5.jpg?alt=media&token=9f92c0d7-0518-4721-a7b5-235c1fb3cc76 (No such file or directory)
我只需要这个来 return 图像旋转了多少,但它总是 returns 0 因为它抛出一个 File not found 表达式。任何帮助将不胜感激。
https:/firebasestorage.googleapis.com/v0/b/pickit-d193d.appspot.com/o/posts%2Ff12e73ad-9bc5-4485-90e5-927dbf8539a5.jpg?alt=media&token=9f92c0d7-0518-4721-a7b5-235c1fb3cc76
是一个 HTTPS URL。它不是文件系统上的文件。
下载文件,然后使用the AndroidX edition of ExifInterface
检查它。
或者,如果您要在 ImageView
中显示这些图像,请使用 image-loading 库,如 Glide 或 Picasso,显示时应考虑 EXIF 方向 headers图片。
所以我实施的答案对我有用,但我不确定它是否适用于所有情况。因此,当我创建图像时,我设置了一个布尔值来检查高度是否大于宽度。然后,当我在 picasso 中加载图像时,我有:
Picasso.get()
.load(imageURL_1)
.fit()
.rotate(post.isRotated()?0:90)
.transform(new RoundedCornersTransformation(30,30))
.into(imageView1);
就像我说的,这只有在图像逆时针旋转 90 度时才有效。如果有更好的解决方法,我欢迎您的回答,但这是我在不访问 EXIF 信息的情况下所能做的最好的。
我正在使用 Firebase 为我的 android 应用存储图像。然后,这些图像会以回收者视图出现在我的应用程序中。这一切都很好,但是,某些图像出现在侧面。特别是那些用 Galaxy S7 拍摄的照片。
我知道我需要从图像中获取 exif 信息,但是当我尝试时出现找不到文件的错误,我该怎么办?
private int getImageOrientation(String imagePath){
int rotate = 0;
try {
File imageFile = new File(imagePath);
ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
} catch (Exception e) {
e.printStackTrace();
}
return rotate;
}
W/System.err: java.io.FileNotFoundException: /https:/firebasestorage.googleapis.com/v0/b/pickit-d193d.appspot.com/o/posts%2Ff12e73ad-9bc5-4485-90e5-927dbf8539a5.jpg?alt=media&token=9f92c0d7-0518-4721-a7b5-235c1fb3cc76 (No such file or directory)
我只需要这个来 return 图像旋转了多少,但它总是 returns 0 因为它抛出一个 File not found 表达式。任何帮助将不胜感激。
https:/firebasestorage.googleapis.com/v0/b/pickit-d193d.appspot.com/o/posts%2Ff12e73ad-9bc5-4485-90e5-927dbf8539a5.jpg?alt=media&token=9f92c0d7-0518-4721-a7b5-235c1fb3cc76
是一个 HTTPS URL。它不是文件系统上的文件。
下载文件,然后使用the AndroidX edition of ExifInterface
检查它。
或者,如果您要在 ImageView
中显示这些图像,请使用 image-loading 库,如 Glide 或 Picasso,显示时应考虑 EXIF 方向 headers图片。
所以我实施的答案对我有用,但我不确定它是否适用于所有情况。因此,当我创建图像时,我设置了一个布尔值来检查高度是否大于宽度。然后,当我在 picasso 中加载图像时,我有:
Picasso.get()
.load(imageURL_1)
.fit()
.rotate(post.isRotated()?0:90)
.transform(new RoundedCornersTransformation(30,30))
.into(imageView1);
就像我说的,这只有在图像逆时针旋转 90 度时才有效。如果有更好的解决方法,我欢迎您的回答,但这是我在不访问 EXIF 信息的情况下所能做的最好的。