Я хочу получить Exif
данные для изображения, которое я выбираю из галереи Android или подобных приложений, таких как Google Фото. Вот методы, которые я использую для получения файла изображения из Uri
:Получить данные 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();
}
Причины я выбираю Bitmap
из Uri
вместо того, чтобы система имени файла происходит потому, что метод фрагментирован для различных версий Android. Кроме того, в таких приложениях, как Google Фото, некоторые фотографии отображаются непосредственно с сервера и не хранятся на устройстве, поэтому получение имени файла невозможно. Даже если я получу имя файла, я получаю Security Exception
при попытке использовать его в своем приложении.
Проблема с этим подходом заключается в том, что когда я получаю Bitmap
, я не получаю данные Exif
. Но мне нужны данные Exif
и прикреплять их к файлу, который я сохраняю в своей папке cache
, чтобы при загрузке изображения на сервер он получал изображение вместе с Exif
, чтобы он мог выполнить некоторую дополнительную обработку. Причина в том, что мне нужно сохранить его как файл или хотя бы получить файл, если он уже существует в системе, потому что Retrofit
нуждается в объекте File
, который затем преобразуется в TypedFile
и отправляется на сервер с использованием запроса Multipart
.
Итак, как я могу точно получить Exif
информацию из любого изображения Uri (локальное или на сервере), а затем сохранить изображение вместе с его данными Exif
, чтобы я мог отправить его на сервер.
Что такое 'FileUtility'? –
Работает очень хорошо. Благодаря!! – javatar