Мне нужно получить файл из DocumentFile или Uri с правильной схемой, а не с content://com.android.externalstorage.documents/tree/primary:
, если выбрана основная память устройства. Чтобы получить файл или абсолютный путь к изображению, мне нужен файл с file: /// storage / emulated / 0 или storage / emulated / 0, но я не смог найти способ получить правильный Uri для создания файла для записи данных EXIF в изображение.
Мой сценарий:
- Пользователь выбирает путь для сохранения изображений, который возвращает Uri с
content://com.android.externalstorage.documents
onActivityResult (). Я сохраняю этот путь сtreeUri.toString()
в SharedPreferences для использования в дальнейшем. - Пользователь делает снимок, и изображение сохраняется с
DocumentFile.fromTreeUri(MainActivity.this, Uri.parse(uriString));
- Здесь я не могу получить файл, который правильно указывает на изображение, Uri с content: // не возвращает существующее изображение. Правильный Uri должен
file:///storage/emulated/
, и я могу преобразовать этот Uri в файл, используяFile filePath = new File(URI.create(saveDir.getUri().toString()));
Как я могу получить Uri, необходимый для создания файла или файла с использованием Uri, полученного из пользовательского интерфейса SAF?
РЕДАКТИРОВАТЬ: ExifInterface Библиотека поддержки представлена для Android 7.1+, которая может использовать InputStream или FileDescriptor.
Uri uri; // the URI you've received from the other app
InputStream in;
try {
in = getContentResolver().openInputStream(uri);
ExifInterface exifInterface = new ExifInterface(in);
// Now you can extract any Exif tag you want
// Assuming the image is a JPEG or supported raw format
} catch (IOException e) {
// Handle any errors
} finally {
if (in != null) {
try {
in.close();
} catch (IOException ignored) {}
}
}
Примечание. ExifInterface не будет работать с удаленными потоками InputStream, например, возвращаемыми из HttpURLConnection. Настоятельно рекомендуется использовать их только с URI content: // или file: //.
Фрагмент выше, очевидно, считывает данные, поскольку он открывает InputStream для чтения данных. Мне нужно иметь возможность записывать данные EXIF в файлы JPEG.