2013-06-21 143 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。