Intereting Posts
Android LinearLayout с цветовым ресурсом: что я делаю неправильно? Android custom listview, setOnItemSelectedListener не работает Ошибка градиента, когда Theme объявляет-стиль в двух библиотеках Каков наиболее подходящий способ хранения пользовательских настроек в приложении Android Firebase Crash производит ANR во время запуска Почему вызов Process.killProcess (Process.myPid ()) – плохая идея? Изменить цвет текста диалогового окна на 5.0+ Потерянный псевдоним хранилища ключей, но есть файл и пароль, используемые для псевдонима Перетащите и передвиньте круг, нарисованный на холсте. Android Support Library 23.2.0, вызывающая стрелку панели инструментов черным У меня возникли проблемы с тем, чтобы интерфейс Android Search работал в панели действий Как изменить цвет фона меню ActionBar (андроид 4 и 5) Как воспроизводить видео на YouTube в приложении для Android? Как скрыть меню опций? Что генерируется и промежуточные папки в каталоге сборки и почему отсутствует папка с выводами

Получить реальный путь для Uri Android

Я разрабатываю VideoPlayer . Я конвертирую URI запущенного намерения в строку, и он дает мне content://media/external..... Но мне нужно получить реальный путь.

Например: /storage/extSdcard....

Как мне это сделать?

Вот мой код при необходимости:

 videoURI = getIntent().getData(); vv.setVideoURI(videoURI); videoName = videoURI.toString(); tvTitle.setText(videoName); 

Solutions Collecting From Web of "Получить реальный путь для Uri Android"

Вы можете использовать этот код для выбранного пути vedio.

 Uri uri = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null); if(cursor.moveToFirst()){ int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String yourRealPath = cursor.getString(columnIndex); } else { //boooo, cursor doesn't have rows ... } cursor.close(); 

Вы можете обратиться к приведенной ниже ссылке для получения справки.

Получить имя файла и путь от URI от медиастора

Надеюсь, вы добьетесь успеха.

Используйте этот код. Это работает для всех версий Android. Это проверенный код. Это поддерживает все устройства

 public static String getPathFromUri(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } // TODO handle non-primary volumes } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[] { split[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); } 

Вот что я использовал раньше:

 public String getRealPathFromURI (Uri contentUri) { String path = null; String[] proj = { MediaStore.MediaColumns.DATA }; Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null); if (cursor.moveToFirst()) { int column_index = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns.DATA); path = cursor.getString(column_index); } cursor.close(); return path; } 

Большинство ответов не работают как для галереи, так и для изображений с камеры. Это работает для меня.

 public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; Log.i("URI",uri+""); String result = uri+""; // DocumentProvider // if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { if (isKitKat && (result.contains("media.documents"))) { String[] ary = result.split("/"); int length = ary.length; String imgary = ary[length-1]; final String[] dat = imgary.split("%3A"); final String docId = dat[1]; final String type = dat[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { } else if ("audio".equals(type)) { } final String selection = "_id=?"; final String[] selectionArgs = new String[] { dat[1] }; return getDataColumn(context, contentUri, selection, selectionArgs); } else if ("content".equalsIgnoreCase(uri.getScheme())) { return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; } 

Попробуй это:

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); System.out.println("picturePath +"+ picturePath ); //path of sdcard } } 

Я нашел более элегантное решение:

 Uri file_uri = Uri.parse(videoURI); // parse to Uri if your videoURI is string String real_path = file_uri.getPath(); // will return real file path 

Назовите это как

  Uri selectedImageURI = data.getData(); //where data is intent return by onActivityResult imageFile = new File(getRealPathFromURI(selectedImageURI)); 

И код для getPath ..

 private String getRealPathFromURI(Uri contentURI) { String result = null; 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 { if(cursor.moveToFirst()) { int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); result = cursor.getString(idx); } cursor.close(); } return result; }