2015-01-08 2 views
3

Я пытаюсь извлечь файл (любой тип) из файлового менеджера и закодировать этот файл в String Base64. Я нашел много ответов с участием ИЗОБРАЖЕНИЙ, но мне нужен любой тип файла. Он то, что я делаю.FileInputStream (file) return ENOENT (Нет такого файла или каталога) android

Я извлечения файла (любого типа) из галереи как этот

Intent intent = new Intent(); 
intent.setType("*/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, "Choose file"), GALLERY_REQUEST_CODE); 

И в моем результате

Uri returnUri = intent.getData(); 

Что дает мне «содержание: //com.android.providers. downloads.documents/документ/1646'

Тогда я пытаюсь

File file = new File(returnUri.getPath()); 

До сих пор так хорошо, но я стараюсь, чтобы закодировать файл в строку Base64:

String str = null; 
    try { 
     str = convertFile(file); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

и метод convertFile

public String convertFile(File file) 
     throws IOException { 
    byte[] bytes = loadFile(file); 
    byte[] encoded = Base64.encode(bytes, Base64.DEFAULT); 
    String encodedString = new String(encoded); 

    return encodedString; 

} 

и метод LoadFile

private static byte[] loadFile(File file) throws IOException { 
    InputStream is = new FileInputStream(file); 

    long length = file.length(); 
    if (length > Integer.MAX_VALUE) { 
     Log.i("MobileReport","Anexo -> loadfile(): File is too big!"); 
     // File is too large 
    } 
    byte[] bytes = new byte[(int)length]; 

    int offset = 0; 
    int numRead = 0; 
    while (offset < bytes.length 
      && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) { 
     offset += numRead; 
    } 

    if (offset < bytes.length) { 
     throw new IOException("It was not possible to read the entire file "+file.getName()); 
    } 

    is.close(); 
    return bytes; 
} 

The ошибка находится в первой строке метода «loadFile»

InputStream is = new FileInputStream(file); 

В приложение падает и в журнале я получил:

java.io.FileNotFoundException: /document/1646: open failed: ENOENT (No such file or directory) 

Я Объявленные разрешения читать и писать. Может ли кто-нибудь помочь мне с этой ошибкой? Спасибо!

ответ

0

returnUri является Uri. Это не путь к файловой системе.

В частности, если вы его осмотрите, вы обнаружите, что это Uri. Чтобы получить InputStream для этого контента, используйте openInputStream() на ContentResolver.

+1

Спасибо за помощь. Я пробовал 'getContentResolver(). OpenInputStream (returnUri)' получил файл не найден. –

+0

@HeitorColangelo: Если вы печатаете 'toString()' из 'returnUri' в LogCat, как это выглядит? – CommonsWare

+0

content: //com.android.providers.downloads.documents/document/1646 –

Смежные вопросы