2014-02-13 229 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);