Я успешно реализую метод получения реального пути к изображению из галереи с помощью Uri
, возвращенного из ACTION_PICK
. Вот пример:
// getRealPathFromURI(intent.getData());
private String getRealPathFromURI(Uri contentURI) {
String result;
Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
if (cursor == null) { // Source is Dropbox or other similar local file path
result = contentURI.getPath();
} else {
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
result = cursor.getString(idx);
cursor.close();
}
return result;
}
Как и этот ответ.
Недавно обновлен атрибут compileSdkVersion
до 29
и, очевидно, атрибут , используемый всеми, устарел<38976665001933>5091933>
В официальных документах они рекомендуют вместо этого использовать FileDescriptor, проблема в том, что я точно не знаю, как это сделать.DATA
Единственное, что я нашел, это этот вопрос. Однако не нашел там правильного ответа.
Пожалуйста, помогите мне преодолеть эту проблему устаревания с помощью решения, используя предложенный способ или любой другой способ.
Спасибо.
Обновление:
Выполнил ответ @CommonsWare и скопировал возвращенный Uri (изображения, которое выбрал пользователь) в локальный каталог, используя context.getContentResolver.openInputStream(Uri)
.
Даже пытался получить файл с Google Диска — сработало. Единственная проблема заключалась в том, что это заняло много времени (около 20 секунд для файла размером 5 МБ).
В качестве бонуса мне разрешили удалить разрешения на внешнее хранилище, которые не нужны для использования локальных каталогов приложения.
У меня больше нет внешних путей!
Попробуйте просто скопировать данные, имеющие объект uri. Как сказал @CommonsWare
FileOutputStream(yourFullPath).use { oStream -> contentResolver.openInputStream(uri)?.use { iStream -> oStream.write(iStream.readBytes()) } }