2015-06-22 8 views
1

У меня это работало одновременно, но теперь он терпит неудачу каждый раз, когда я пытаюсь получить путь к файлу. Я получаю файл из Acrobat Reader и могу получить имя и размер файла, но не относительный путь к файлу.Получить путь к файлу из содержимого URI

Мой код выглядит следующим образом:

if(uri.getScheme().equals("content")) 
     { 
      String[] dataFields = new String[]{ 
        MediaStore.MediaColumns.DATA, 
        OpenableColumns.DISPLAY_NAME, 
        OpenableColumns.SIZE}; 
     Cursor cursor = context.getContentResolver().query(uri, dataFields, null, null, null); 
     cursor.moveToFirst(); 

     fileLocation = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA)); 
     title = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 
     size = cursor.getInt(cursor.getColumnIndex(OpenableColumns.SIZE)); 

     cursor.close(); 

     contentType = context.getContentResolver().getType(uri); 
    } 

Я получаю следующее сообщение об ошибке в LogCat:

Failed to read row 0, column -1 from a CursorWindow which has 1 rows, 2 columns. 

Я понимаю, как он не может найти столбец. Однако я не понимаю, как это может быть?

ответ

4

A Uri is not a file. Нет требования, чтобы Uri был от MediaStore или иным образом имел столбец MediaStore.MediaColumns.DATA. Если вы хотите получить доступ к содержимому, представленному Uri, используйте openInputStream() на ContentResolver.

+0

True ... я хочу, чтобы получить путь к файлу без «content: //» и других папок, чтобы позднее я смог открыть файл в объекте File. – Sulby

+0

@ FireFly3000: «Я хочу получить путь к файлу» - путь к файлу отсутствует. Нет требования, чтобы данные, стоящие за 'Uri', были файлом, к которому вы можете получить доступ любым способом. Это может быть во внутреннем хранилище. Он может быть в съемном хранилище. Он может быть зашифрован. Это может быть даже не файл, а потоковое воспроизведение в реальном времени в Интернете. – CommonsWare