gpt4 book ai didi

android - 使用 Uri 获取 Exif 数据

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:08 38 4
gpt4 key购买 nike

我想获取我从 Android 图库或类似应用(如 Google 照片)中挑选的图像的 Exif 数据。以下是我用于从 Uri 获取图像文件的方法:

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 是 fragment 化的。另外,在 Google Photos 等应用程序中,一些照片直接从服务器显示,不存储在设备上,因此无法获取文件名。即使我得到了文件名,当我尝试在我的应用程序中使用它时,我也会得到 Security Exception

这种方法的问题是,当我得到 Bitmap 时,我没有得到 Exif 数据。但是我需要 Exif 数据并将其附加到我保存在 cache 文件夹中的文件中,这样当我将图像上传到服务器时,它会与 Exif 以便它可以做一些进一步的处理。原因,我需要将它保存为文件或至少获取文件,如果它已经存在于系统中是因为 Retrofit 需要一个 File 对象然后被转换到 TypedFile 并使用 Multipart 请求发送到服务器。

那么,我怎样才能准确地从任何类型的图像 Uri(本地或服务器上)获取 Exif 信息,然后将图像连同它的 Exif 数据一起保存,这样我可以将它发送到服务器。

最佳答案

以下代码可能对您有所帮助

String path = FileUtility.getRealPathFromURI(context, Uri.parse(bitmapUri.getPath());
ExifInterface exif = new ExifInterface(path);
rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_NORMAL);

FileUtility.java

public static String getRealPathFromURI(Context context, Uri contentUri) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
return getPathForV19AndUp(context, contentUri);
} else {
return getPathForPreV19(context, contentUri);
}
}


public static String getPathForPreV19(Context context, Uri contentUri) {
String res = null;

String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
if(cursor.moveToFirst()){;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
res = cursor.getString(column_index);
}
cursor.close();

return res;
}

@TargetApi(Build.VERSION_CODES.KITKAT)
public static String getPathForV19AndUp(Context context, Uri contentUri) {
String wholeID = DocumentsContract.getDocumentId(contentUri);

// Split at colon, use second item in the array
String id = wholeID.split(":")[1];
String[] column = { MediaStore.Images.Media.DATA };

// where id is equal to
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = context.getContentResolver().
query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
column, sel, new String[]{ id }, null);

String filePath = "";
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}

cursor.close();
return filePath;
}

关于android - 使用 Uri 获取 Exif 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37743937/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com