Intent.ACTION_OPEN_DOCUMENT. Реальный путь до файла ЛЮБОГО расширения

Реализован выбор файлов пользователем. Выбирать он может файлы любого расширения. Необходимо узнать реальный путь до файла (не uri), так как потом этот файл отправляется на удалённый сервер и для этого нужен именно реальный путь. Есть такой код:

public  String getFilePath(Uri uri) {
    String selection = null;
    String[] selectionArgs = null;
    if (Build.VERSION.SDK_INT >= 19 && DocumentsContract.isDocumentUri(this, uri)) {
        if (isExternalStorageDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            return Environment.getExternalStorageDirectory() + "/" + split[1];
        } else if (isDownloadsDocument(uri)) {
            final String id = DocumentsContract.getDocumentId(uri);
            uri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
        } else if (isMediaDocument(uri)) {
            final String docId = DocumentsContract.getDocumentId(uri);
            final String[] split = docId.split(":");
            final String type = split[0];
            if ("image".equals(type)) {
                uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            } else if ("video".equals(type)) {
                uri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
            } else if ("audio".equals(type)) {
                uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            }
            selection = "_id=?";
            selectionArgs = new String[]{split[1]};
        }
    }
    if ("content".equalsIgnoreCase(uri.getScheme())) {
        String[] projection = {MediaStore.Images.Media.DATA};
        Cursor cursor = null;
        try {
            cursor = getContentResolver().query(uri, projection, selection, selectionArgs, null);
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            if (cursor.moveToFirst()) {
                return cursor.getString(column_index);
            }
        } catch (Exception e) {
        } finally { if (cursor != null)   cursor.close();
        }
    } else if ("file".equalsIgnoreCase(uri.getScheme())) {
        return uri.getPath();
    }
    return null;
}

Работает прекрасно, но только для медиафайлов (картинки, видео, аудио). Мне же нужно, чтобы работал для всех расширений (особенно pdf, zip). Ошибка при попытке выбрать файл другого типа:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=777, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/oferta.pdf flg=0x43 }} to activity {com.example.myapp/com.example.mytestapp.MyActivity}: java.lang.NumberFormatException: For input string: "raw:/storage/emulated/0/Download/oferta.pdf"

Причём в тексте ошибки по сути присутствует сам нужный мне путь. Более того, при выборе pdf-файла из другой дирректории (не Download) ошибка почему-то не вылетает и путь определяется верно. Подскажите, что подправить в коде, чтобы вытащить реальный путь к файлу любого типа из uri без ошибок?


Ответы (2 шт):

Автор решения: Sergei Buvaka

Ну у вас есть URI, вызовите

new File(uri.getPath());

И вот вам файл который вы можете отправить куда угодно.

Ну или просто uri.getPath();

→ Ссылка
Автор решения: denisnumb

Возможно вам поможет метод getRealPathFromURI(data.getData()).

data - полученный файл

private String getRealPathFromURI(Uri contentUri) {

        String[] proj = { MediaStore.Video.Media.DATA };
        Cursor cursor = managedQuery(contentUri, proj, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
}

Еще методы:

1. context.getContentResolver().openInputStream(uri)

2. context.getContentResolver().openFileDescriptor(uri, "r")?.getFileDescriptor()

→ Ссылка