2014-02-13 1 views
1

Я пишу процесс, который загружает/копирует файл, прикрепленный к Gmail, на SD-карту, которую мое приложение может читать. Когда пользователь нажимает на приложение, моя активность запущена, и я использую следующий код для сохранения в локальном хранилище;Ошибка загрузки файла в Gmail с getContentResolver()

InputStream in = getContentResolver().openInputStream(intent.getData()); 
String ext = intent.getType().equals("text/xml") ? ".xml" : ".gpkg"; 
localFile = new File(TILE_DIRECTORY, "tmp/"+intent.getDataString().hashCode()+ext); 

// If we haven't already cached the file, go get it.. 
if (!localFile.exists()) { 
    localFile.getParentFile().mkdirs(); 
    FileIO.streamCopy(in, new BufferedOutputStream(new FileOutputStream(localFile))); 
} 

FileIO.streamCopy - это просто;

public static void streamCopy(InputStream in, OutputStream out) throws IOException{ 
    byte[] b = new byte[BUFFER]; 
    int read; 
    while ((read = in.read(b)) != -1) { 
      out.write(b, 0, read); 
    } 
    out.close(); 
    in.close(); 
} 

Это все прекрасно работает на небольшой файл, но с приложением 6MB только 12Kb когда-либо получения письменного. Я даже не получаю сообщение об ошибке, процесс проходит очень быстро, и я остаюсь с поврежденным файлом.

Этот процесс выполняется в отдельном потоке и является частью более крупного приложения с большим количеством FileIO, так что это не проблема с разрешениями/каталогов и т.д.

Есть ли что-то другое, что должен делать с поток?

Кстати, intent.getData() является

content://gmail-ls/[email protected]/messages/6847/attachments/0.1/BEST/false 

и intent.getType() является

application/octet-stream 

Благодаря

ответ

0

Все работы в порядке с этим кодом

InputStream in = new BufferedInputStream(
getContentResolver().openInputStream(intent.getData())); 

File dir = getExternalCacheDir(); 
File file = new File(dir, Utils.md5(uri.getPath())); 

OutputStream out = new BufferedOutputStream(new FileOutputStream(file)); 

streamCopy(in, out); 
Смежные вопросы