我想获取Exif
数据,以便从Android图库或Google Photos等类似应用中挑选图像。下面是我使用从Uri
获取图像文件的方法:使用Uri获取Exif数据
public static String getActualPathFromUri(@NonNull Context context, @NonNull Uri selectedImageUri) {
Bitmap bitmap = null;
try {
bitmap = getBitmapFromUri(context, selectedImageUri);
} catch (IOException e) {
e.printStackTrace();
}
if (bitmap == null) {
return null;
}
File imageFileFolder = new File(context.getCacheDir(), "example");
if (!imageFileFolder.exists()) {
imageFileFolder.mkdir();
}
FileOutputStream out = null;
File imageFileName = new File(imageFileFolder, "example-" + System.currentTimeMillis() + ".jpg");
try {
out = new FileOutputStream(imageFileName);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
out.flush();
out.close();
} catch (IOException e) {
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return imageFileName.getAbsolutePath();
}
private static Bitmap getBitmapFromUri(@NonNull Context context, @NonNull Uri uri) throws IOException {
ParcelFileDescriptor parcelFileDescriptor =
context.getContentResolver().openFileDescriptor(uri, "r");
assert parcelFileDescriptor != null;
FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
parcelFileDescriptor.close();
}
我从Uri
选择加入而不是让系统文件名Bitmap
的原因是因为该方法是零散的不同版本的Android。另外,在Google相册等应用中,有些照片直接从服务器上显示,并未存储在设备上,因此无法获取文件名。即使我得到的文件名,我试图在我的应用程序中使用时得到Security Exception
。
这种方法的问题是,当我得到Bitmap
,我没有得到Exif
数据。但我需要Exif
数据并将其附加到我保存在我的cache
文件夹中的文件中,以便当我将图像上载到服务器时,它将获取图像以及Exif
,以便它可以进行一些进一步处理。原因是,我需要将其保存为文件或至少获取文件(如果它已存在于系统中),因为Retrofit
需要一个File
对象,然后该对象将被转换为TypedFile
并使用Multipart
请求发送到服务器。因此,我怎样才能从任何类型的图像Uri(本地或服务器)上准确获取Exif
信息,然后将图像与其Exif
数据一起保存,以便我可以将其发送到服务器。
什么是'FileUtility'? –
工作得很好。谢谢!! – javatar