2015-02-23 35 views
0

我想通過一個字節[]持有音樂文件到我的應用程序中的另一個活動。但是當我這樣做時,我得到失敗的活頁夾錯誤,這意味着音樂文件的大小太大(超過2MB)。然後我繼續嘗試用下面的方法壓縮它,但仍然給我錯誤。我如何獲得1MB以下的文件來傳遞它的意圖或有沒有使用意圖的另一種方式來實現這一點?傳遞字節數組之間的活動android

壓縮代碼:

public static byte[] zipByteArray(byte[] file) 
      throws IOException{ 
     byte[] byReturn = null; 
     Deflater oDeflate = new Deflater(Deflater.DEFLATED, false); 
     oDeflate.setInput(file); 
     oDeflate.finish(); 
     ByteArrayOutputStream oZipStream = new ByteArrayOutputStream(); 
     try { 
      while (! oDeflate.finished()){ 
       byte[] byRead = new byte[ZIP_BUFFER_SIZE]; 
       int iBytesRead = oDeflate.deflate(byRead); 
       if (iBytesRead == byRead.length){ 
        oZipStream.write(byRead); 
       } 
       else { 
        oZipStream.write(byRead, 0, iBytesRead); 
       } 
      } 
      oDeflate.end(); 
      byReturn = oZipStream.toByteArray(); 
     } 
     finally { 
      oZipStream.close(); 
     } 
     return byReturn; 
    } 
+0

*小心*使用靜態數據成員。通過「小心」,我的意思是確保不會泄漏2MB的byte []'。 – CommonsWare 2015-02-23 22:36:36

+0

我認爲你可以嘗試另一種方式,在活動A中將其寫入磁盤並將該位置傳遞給活動B,然後再讀取它。在內存讀取中可能效率不高。 – kosa 2015-02-23 22:36:46

回答

2

直通傳遞一個文件作爲參數的意圖是不是一個很好的主意(或設計意圖什麼的)。試圖對其進行壓縮是一種創新性措施,如果限制發生變化或文件本身需要更改爲不適合壓縮格式的文件,則該措施將會中斷。

您應該改爲創建一個臨時文件(或其他可以從意圖引用的臨時存儲),並通過您的意圖傳遞引用。一個靜態成員可能會工作,但是你必須非常小心,不要將引用保留太久,否則會導致內存泄漏。

+0

要創建一個臨時存儲來存儲和檢索,不能相信我沒有想到這樣做。謝謝! – user3368956 2015-02-23 22:44:35