2015-02-23 66 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