Преобразовать файл: Uri в файл на Android

Какой самый простой способ конвертировать из file: android.net.Uri в File на Android?

Пробовал следующее, но он не работает:

  final File file = new File(Environment.getExternalStorageDirectory(), "read.me"); Uri uri = Uri.fromFile(file); File auxFile = new File(uri.toString()); assertEquals(file.getAbsolutePath(), auxFile.getAbsolutePath()); 

Solutions Collecting From Web of "Преобразовать файл: Uri в файл на Android"

Что вы хотите …

 new File(uri.getPath()); 

… и не…

 new File(uri.toString()); 

ПРИМЕЧАНИЕ: url.toString() возвращает строку в формате: "file:///mnt/sdcard/myPicture.jpg" , тогда как url.getPath() возвращает строку в формате: "/mnt/sdcard/myPicture.jpg" ,

Нет никакого «простого» способа сделать это. Uri не является File . Uri не должен представлять файл в файловой системе, к которой вы можете получить доступ. Uri может указывать на контент, который:

  • Хранятся на съемном носителе, к которому вы не можете получить доступ
  • Хранятся во внутреннем хранилище другого приложения, к которому вы не можете получить доступ
  • Хранится в зашифрованном виде, где ContentProvider должен расшифровать его
  • Хранится в столбце BLOB базы данных SQLite, где ContentProvider должен загружать его и обслуживать
  • Хранится в «облаке», где ContentProvider необходимо загрузить его
  • Созданный «на лету», как эта веб-страница
  • и так далее

Вы можете использовать ContentResolver и openInputStream() чтобы получить InputStream на контент, представленный Uri . Вы можете создать FileOutputStream в каком-либо файле, который вы контролируете. И вы можете использовать Java I / O для копирования из InputStream в OutputStream , создавая собственную копию содержимого в файле, который вы контролируете.

EDIT: Извините, я должен был лучше проверить раньше. Это должно работать:

 new File(new URI(androidURI.toString())); 

URI – java.net.URI.

После долгого поиска это то, что сработало для меня:

 File file = new File(getPath(uri)); public String getPath(Uri uri) { String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if (cursor == null) return null; int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String s=cursor.getString(column_index); cursor.close(); return s; } 

использование

 InputStream inputStream = getContentResolver().openInputStream(uri); 

Напрямую и скопировать файл. Также см:

https://developer.android.com/guide/topics/providers/document-provider.html

Ничто из этого не работает для меня. Я нашел это рабочим решением:

 String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getActivity().getContentResolver().query(uri, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String filePath = cursor.getString(columnIndex); cursor.close(); 

Я сделал это следующим образом:

 try { readImageInformation(new File(contentUri.getPath())); } catch (IOException e) { readImageInformation(new File(getRealPathFromURI(context, contentUri))); } public static String getRealPathFromURI(Context context, Uri contentUri) { String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null); int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } 

Поэтому вначале я сначала пытаюсь использовать файл, т.е. изображение, сделанное камерой, и сохраненное на SD-карте. Это не работает для изображения, возвращаемого: Intent photoPickerIntent = new Intent (Intent.ACTION_PICK); В этом случае необходимо преобразовать Uri в реальный путь с getRealPathFromURI() функции getRealPathFromURI() . Поэтому вывод заключается в том, что это зависит от того, какой тип Uri вы хотите преобразовать в файл.

@CommonsWare хорошо объяснил все. И мы действительно должны использовать предлагаемое им решение.

Кстати, только информация, на которую мы могли бы рассчитывать при ContentResolver – это имя и размер файла, как указано здесь: Получение информации о файле | Разработчики Android

Как вы могли видеть, есть интерфейс OpenableColumns который содержит только два поля: DISPLAY_NAME и SIZE.

В моем случае мне нужно было получить информацию EXIF ​​о изображении JPEG и повернуть его, если необходимо, перед отправкой на сервер. Для этого я скопировал содержимое файла во временный файл с помощью ContentResolver и openInputStream()

Для людей, которые здесь ищут решение для изображений, в частности, здесь.

 private Bitmap getBitmapFromUri(Uri contentUri) { String path = null; String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(contentUri, projection, null, null, null); if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); path = cursor.getString(columnIndex); } cursor.close(); Bitmap bitmap = BitmapFactory.decodeFile(path); return bitmap; } 

Файл imageToUpload = новый файл (новый URI (androidURI.toString ())); Работает, если это файл u, который был создан во внешнем хранилище.

Например файл: /// storage / emulated / 0 / (некоторая директория и имя файла)