2013-06-21 140 views
3
06-21 12:35:37.275: E/AndroidRuntime(12402): FATAL EXCEPTION: Thread-1864 
06-21 12:35:37.275: E/AndroidRuntime(12402): java.lang.OutOfMemoryError 
06-21 12:35:37.275: E/AndroidRuntime(12402): at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91) 
06-21 12:35:37.275: E/AndroidRuntime(12402): at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201) 
06-21 12:35:37.275: E/AndroidRuntime(12402): at libcore.net.http.RetryableOutputStream.write(RetryableOutputStream.java:61) 
06-21 12:35:37.275: E/AndroidRuntime(12402): at java.io.BufferedOutputStream.write(BufferedOutputStream.java:131) 
06-21 12:35:37.275: E/AndroidRuntime(12402): at java.io.OutputStream.write(OutputStream.java:82) 
06-21 12:35:37.275: E/AndroidRuntime(12402): at com.facebook.android.Util.openUrl(Util.java:190) 
06-21 12:35:37.275: E/AndroidRuntime(12402): at com.facebook.android.Facebook.request(Facebook.java:563) 
06-21 12:35:37.275: E/AndroidRuntime(12402): at dev.env.secvideo.SaveActivity$FBRequestListener.onComplete(SaveActivity.java:467) 
06-21 12:35:37.275: E/AndroidRuntime(12402): at com.facebook.android.AsyncFacebookRunner$2.run(AsyncFacebookRunner.java:254) 

当我试图从我的app.i上传视频到Facebook我得到这个错误message.my视频大小约15-20 MB。我的代码是在较低versions.I正常运行正在此错误只在更高版本在4.0以上内存不足异常

我使用下面的代码

public byte[] readBytes(String path) throws IOException { 

     InputStream is = new FileInputStream(path); 
     ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(path.length()); 

     //int bufferSize = 30*1024; 
     byte[] buffer = new byte[path.length()]; 

     int len = 0; 
     while ((len = is.read(buffer)) != -1) { 
      byteBuffer.write(buffer, 0, len); 
     } 
     return byteBuffer.toByteArray(); 
    } 
    public class FBRequestListener implements RequestListener 
    { 

     @Override 
     public void onComplete(String response, Object state) { 

      byte[] data = null; 
      String path = Environment.getExternalStorageDirectory()+"/recordvideooutput.3gp"; 
      String datapath = new File(path).getAbsolutePath(); 
      String datamsg = "My Video"; 
      Bundle params; 
      try { 
       //InputStream is = new FileInputStream(datapath); 
       //data = readBytes(is); 
       data = readBytes(datapath); 
       params = new Bundle(); 
       params.putString(Facebook.TOKEN, access_token); 
       params.putString("message", datamsg); 
       params.putString("contentType", "video/quicktime"); 
       params.putByteArray("video.mov", data); 
       String request = facebook.request("me/videos", params, "POST"); 
       Log.i("request", request); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onIOException(IOException e, Object state) { 


     } 

     @Override 
     public void onFileNotFoundException(FileNotFoundException e, 
       Object state) { 


     } 

     @Override 
     public void onMalformedURLException(MalformedURLException e, 
       Object state) { 


     } 

     @Override 
     public void onFacebookError(FacebookError e, Object state) { 


     } 

    } 
+0

如何在没有源代码的情况下帮助您? – mithrop

+0

您正在将整个文件加载到内存中。现在有办法将文件从磁盘传输到网络吗? – brianestey

+0

你正在调用'facebook.request'的什么是'facebook'对象? – brianestey

回答

2

添加机器人:largeHeap =“真正的”应用程序标记下的Android Manifest文件。这增加了您可用的可用内存空间。但是,这只适用于API 11+。

+1

感谢ashwin现在它的工作,但它需要更多的时间来上传如何减少上传时间 –

+0

压缩您的视频发送之前。 – tolgap

0

基本上,你不能像你试图做的那样去做。因为你正在将整个文件读入内存,所以在它进入网络之前,你正在耗尽内存。

有可以做,以帮助这几个选项:

  1. 您可以压缩视频,这意味着你可以为15MB小型化。根据压缩情况,您应该能够将此文件加载到内存中。但是,这不是保证,您仍然可能遇到问题。

  2. 我检查了Facebook API,看起来他们看起来并不像他们支持通过他们的Android SDK流式传输数据。这意味着你需要推出自己的。他们确实有一个API可以在他们的网站上执行(http://developers.facebook.com/docs/reference/api/video/),所以你必须弄清楚如何使用该API,然后,一旦你了解它,将数据流式传输到他们的Web服务,而不是试图将它们全部加载到一个facebook.request对象。

这里有一篇博客文章(http://developers.facebook.com/blog/post/493/),介绍了如何将其作为POST请求来完成。具体而言,从博客引用

要发布视频,请将带有视频文件附件的POST请求作为multipart/form-data发送到https://graph-video.facebook.com/me/videos

有一个PHP示例,您可能能够将关键件从Java转换为Java并转换为Java。

我会尝试做第二种方法,如果我在你的鞋子。希望有所帮助。

+0

感谢您的回答 –

+0

只要你知道,largeHeap选项不是一个修复。看看文档(http://developer.android.com/guide/topics/manifest/application-element.html#largeHeap),特别是它说“大多数应用程序不应该需要这个,而应该专注于减少它们整体内存使用率提高了性能。启用此功能也不能保证可用内存的固定增加,因为某些设备受其可用内存总量的限制。“如果您想制作防弹应用程序,我建议您考虑流媒体。 – brianestey

0

有时你需要增加可用于eclipse的工作内存,但是编辑在eclipse目录中找到的eclipse.ini文件,最后一行,缺省值为512m,这意味着只有512mb已被用作eclipse的内存,增加这和你的日食会有更多的内ra。