Конвертировать файл: URI к файлу в Андроид
какой самый простой способ конвертировать из 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());
15 ответов:
то, что вы хотите...
new File(uri.getPath());... и нет...
new File(uri.toString());Примечание:
uri.toString()возвращает строку в формате:"file:///mnt/sdcard/myPicture.jpg", тогда какuri.getPath()возвращает строку в формате:"/mnt/sdcard/myPicture.jpg".
после долгого поиска это то, что сработало для меня:
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; }
EDIT: Извините, я должен был проверить лучше раньше. Это должно работать:
new File(new URI(androidURI.toString()));Ури является Java.чистая.Ури.
ничего из этого не работает для меня. Я обнаружил, что это рабочее решение. но мой случай специфичен для изображений.
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();
использовать
InputStream inputStream = getContentResolver().openInputStream(uri);непосредственно и скопируйте файл. Также смотрите:
https://developer.android.com/guide/topics/providers/document-provider.html
С Котлином еще проще:
val file = File(uri.path)или если вы используете расширения Kotlin для Android:
val file = uri.toFile()
Я сделал это следующим образом:
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 = новое намерение (намерение.ACTION_PICK); В этом случае необходимо преобразовать Uri в реальный путь с помощью
@CommonsWare объяснил все довольно хорошо. И мы действительно должны использовать решение, которое он предложил.
кстати, единственная информация, которую мы могли бы положиться, когда quering
ContentResolver- Это имя и размер файла, как указано здесь: получение информации о файле / разработчики Androidкак вы могли видеть, есть интерфейс
OpenableColumnsкоторый содержит только два поля: DISPLAY_NAME и SIZE.в моем случае мне нужно было получить информацию EXIF о a JPEG изображение и повернуть его, если это необходимо перед отправкой на сервер. Для этого я скопировал содержимое файла во временный файл с помощью
ContentResolverиopenInputStream()
Лучшим Решением
создать один простой класс java FileUtil и использовать для создания, копирования и переименования файла
Я использую
uri.toString()иuri.getPath()но не работает для меня. Я, наконец, нашел это решение.import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.OpenableColumns; import android.util.Log; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class FileUtil { private static final int EOF = -1; private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; private FileUtil() { } public static File from(Context context, Uri uri) throws IOException { InputStream inputStream = context.getContentResolver().openInputStream(uri); String fileName = getFileName(context, uri); String[] splitName = splitFileName(fileName); File tempFile = File.createTempFile(splitName[0], splitName[1]); tempFile = rename(tempFile, fileName); tempFile.deleteOnExit(); FileOutputStream out = null; try { out = new FileOutputStream(tempFile); } catch (FileNotFoundException e) { e.printStackTrace(); } if (inputStream != null) { copy(inputStream, out); inputStream.close(); } if (out != null) { out.close(); } return tempFile; } private static String[] splitFileName(String fileName) { String name = fileName; String extension = ""; int i = fileName.lastIndexOf("."); if (i != -1) { name = fileName.substring(0, i); extension = fileName.substring(i); } return new String[]{name, extension}; } private static String getFileName(Context context, Uri uri) { String result = null; if (uri.getScheme().equals("content")) { Cursor cursor = context.getContentResolver().query(uri, null, null, null, null); try { if (cursor != null && cursor.moveToFirst()) { result = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } } if (result == null) { result = uri.getPath(); int cut = result.lastIndexOf(File.separator); if (cut != -1) { result = result.substring(cut + 1); } } return result; } private static File rename(File file, String newName) { File newFile = new File(file.getParent(), newName); if (!newFile.equals(file)) { if (newFile.exists() && newFile.delete()) { Log.d("FileUtil", "Delete old " + newName + " file"); } if (file.renameTo(newFile)) { Log.d("FileUtil", "Rename file to " + newName); } } return newFile; } private static long copy(InputStream input, OutputStream output) throws IOException { long count = 0; int n; byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; while (EOF != (n = input.read(buffer))) { output.write(buffer, 0, n); count += n; } return count; } }класс пользователя FileUtil в вашем коде
try { File file = FileUtil.from(MainActivity.this,fileUri); Log.d("file", "File...:::: uti - "+file .getPath()+" file -" + file + " : " + file .exists()); } catch (IOException e) { e.printStackTrace(); }
вы можете получить файл из файла Uri, используя следующий метод. Он DocumentFile для параметра, но вы можете легко изменить его. Самый простой способ проверить этот метод для создания файла uri с помощью
DocumentFile.fromFile(Environment.getExternalStorageDirectory());который имеет Urifile:///storage/emulated/0/** * Gets File from DocumentFile if Uri is file:/// * * @param documentFile Document file that contains Uri to create File from * @return File with absolute path to the physical file on device memory */ public static File getFileFromDocumentFile(DocumentFile documentFile) { try { File file = new File(URI.create(documentFile.getUri().toString())); return file; } catch (Exception e) { return null; } }вместо создания файлов из Uri используйте
DocumentFile.fromTreeUri(Context, Uri)илиDocumentFile.fromSingleri(Context, Uri)для создания или удаления файлов и для потоков используйтеgetContentResolver().openOutputStream(documentFile.getUri())иgetContentResolver().openInputStream(documentFile.getUri())для записи файлов и чтения файлов.
публичная строка getRealPathFromURI(Uri uri) {
String result; Cursor cursor = getContentResolver().query(uri, null, null, null, null); if (cursor == null) { result = uri.getPath(); cursor.close(); return result; } cursor.moveToFirst(); int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); result = cursor.getString(idx); cursor.close(); return result; }затем использование для получения файла из URI:
File finalFile = newFile(getRealPathFromURI(uri));--НАДЕЖДА МОЖЕТ ПОМОЧЬ ВАМ - - - -
Android + Kotlin
добавить зависимость для расширений Kotlin Android:
implementation 'androidx.core:core-ktx:{latestVersion}'получить файл из uri:
uri.toFile()Android + Java
просто переместить наверх ;)
С помощью следующего кода я могу получить общий pdf-файл приложения adobe в виде потока и сохранить его в пути приложения android
Android.Net.Uri fileuri = (Android.Net.Uri)Intent.GetParcelableExtra(Intent.ExtraStream); fileuri i am getting as {content://com.adobe.reader.fileprovider/root_external/ data/data/com.adobe.reader/files/Downloads/sample.pdf} string filePath = fileuri.Path; filePath I am gettings as root_external/data/data/com.adobe.reader/files/Download/sample.pdf using (var stream = ContentResolver.OpenInputStream(fileuri)) { byte[] fileByteArray = ToByteArray(stream); //only once you can read bytes from stream second time onwards it has zero bytes string fileDestinationPath ="<path of your destination> " convertByteArrayToPDF(fileByteArray, fileDestinationPath);//here pdf copied to your destination path } public static byte[] ToByteArray(Stream stream) { var bytes = new List<byte>(); int b; while ((b = stream.ReadByte()) != -1) bytes.Add((byte)b); return bytes.ToArray(); } public static string convertByteArrayToPDF(byte[] pdfByteArray, string filePath) { try { Java.IO.File data = new Java.IO.File(filePath); Java.IO.OutputStream outPut = new Java.IO.FileOutputStream(data); outPut.Write(pdfByteArray); return data.AbsolutePath; } catch (System.Exception ex) { return string.Empty; } }
для людей, которые ищут решение для изображений в частности вот это.
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; }
File imageToUpload = новый файл (новый URI (androidURI.toString ())); работает, если это файл, который вы создали во внешнем хранилище.
например file: / / / storage / emulated/0/(некоторые каталог и имя файла)
Comments