Как получить путь к файлу из URI?

Пожалуйста, найдите мой код ниже. Мне нужно получить путь к файлу PDF-документа, выбранный пользователем с SD-карты. Проблема в том, что URI.getPath () возвращает:

/file:///mnt/sdcard/my%20Report.pdf/my Report.pdf

Правильный путь:

/sdcard/my Report.pdf

Обратите внимание, что я искал в stackoverflow, но нашел пример получения filePath изображения или видео, нет примера того, как получить путь к файлу в случае PDF?

Мой код, а НЕ весь код, а только его часть в формате pdf:

 public void openPDF(View v)
 {
     Intent intent = new Intent();
     //intent.setType("pdf/*");
     intent.setType("application/pdf");
     intent.setAction(Intent.ACTION_GET_CONTENT);
     startActivityForResult(Intent.createChooser(intent, "Select Pdf"), SELECT_PDF_DIALOG);
 }
 public void onActivityResult(int requestCode, int resultCode, Intent result) 
 {
     if (resultCode == RESULT_OK) 
     {
         if (requestCode == SELECT_PDF_DIALOG) 
         {
             Uri data = result.getData();
             if(data.getLastPathSegment().endsWith("pdf"))
             {
                String pdfPath = data.getPath();
             } 
             else 
             {
                 CommonMethods.ShowMessageBox(CraneTrackActivity.this, "Invalid file type");   
             }               
          }
      }
 }

Могут ли некоторые помочь мне, как получить правильный путь из URI?


person Yaqub Ahmad    schedule 16.01.2012    source источник
comment
Вот правильный ответ на вопрос [посмотрите] [1] [1]: stackoverflow.com/questions/3401579/   -  person sheetal    schedule 20.02.2013


Ответы (2)


File myFile = new File(uri.toString());
myFile.getAbsolutePath()

должен вернуть вам правильный путь

ИЗМЕНИТЬ

Как предположил @Tron, рабочий код

File myFile = new File(uri.getPath());
myFile.getAbsolutePath()
person Seshu Vinay    schedule 17.01.2012
comment
У меня нет ФАЙЛА здесь, мне нужно получить его из Ури. - person Yaqub Ahmad; 17.01.2012
comment
Его возвращение: /content:/com.quickoffice.mx.samsung/file%3A%2F%2F%2Fmnt%2Fsdcard%2FMy%2520Report.pdf/My%20Report.pdf?MIME-TYPE=application%2Fpdf. - person Yaqub Ahmad; 17.01.2012
comment
developer.android.com/reference/java/io/File.html - person Seshu Vinay; 17.01.2012
comment
Вы можете увидеть этот метод в этой ссылке. Описание говорит, что возвращает правильный путь. - person Seshu Vinay; 17.01.2012
comment
Большое спасибо за вашу помощь, но это не работает. Я пробовал как getAbsolutePath (), так и getPath (), но не вернул правильный путь. Вы можете попробовать, и вы увидите результаты. - person Yaqub Ahmad; 17.01.2012
comment
@Seshu Vinay anwser ошибается. Файл не может создать объект, начинающийся со строки схемы file://. @Yaqub Ахмад деводе после строки uri.getPath с URLDecoder.decode. - person Yura Shinkarev; 30.08.2013
comment
Чтобы исправить это, используйте: File myFile = new File (uri.getPath ()); - хорошо работает для file: // ... URI. - person Quark; 27.03.2015
comment
Он должен быть конкретным. Kitkat не вернет то же самое, что Lollipop. Это чертовски беспорядок. - person Oliver Dixon; 06.04.2016
comment
Не работает. Тестирование по API 23 - person eC Droid; 08.09.2017

Вот ответ на вопрос здесь

На самом деле мы должны получить его от распространяемого ContentProvider приложения Camera.

РЕДАКТИРОВАТЬ . Копирование ответа, который сработал для меня

private String getRealPathFromURI(Uri contentUri) {
    String[] proj = { MediaStore.Images.Media.DATA };
    CursorLoader loader = new CursorLoader(mContext, contentUri, proj, null, null, null);
    Cursor cursor = loader.loadInBackground();
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    String result = cursor.getString(column_index);
    cursor.close();
    return result;
}
person sheetal    schedule 20.02.2013
comment
Это был единственный способ узнать реальный путь к файлу для моего физического устройства. Не знаю почему, но мое устройство и мой эмулятор работают по-другому. - person Aliton Oliveira; 16.05.2019
comment
MediaStore.Images.Media.DATA устарел - person Milan Sheth; 19.06.2020