2013-06-21 2 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에 비디오를 업로드하려고 할 때이 오류 메시지가 나타납니다. 비디오 크기는 약 15-20MB입니다. 내 코드가 낮은 versions.I에서 제대로 실행되고 내가 안드로이드를 추가 다음 코드메모리 부족 예외

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

를 사용하고 4.0

이상에만 높은 버전에서이 오류를 얻고있다 : largeHeap = "true"로 응용 프로그램 태그 아래에 Android Manifest 파일. 이렇게하면 사용 가능한 메모리 공간이 늘어납니다. 그러나 이는 API 11 이상에서만 작동합니다.

+1

감사합니다. ashwin이 작동하지만 업로드 시간을 단축하는 방법을 업로드하는 데 더 많은 시간이 걸립니다. –

+0

동영상을 보내기 전에 압축하십시오. – tolgap

0

기본적으로 당신이하려는 방식대로 할 수 없습니다. 전체 파일을 메모리로 읽으므로 네트워크에 도달하기 전에 마음대로 메모리를 다 써 버릴 수 있습니다.

이 돕기 위해 할 수있는 몇 가지 옵션이 있습니다 :

  1. 당신은 당신의 15메가바이트의 크기가 감소 할 수 있음을 의미, 비디오를 압축 할 수 있습니다. 압축에 따라이 파일을 메모리에로드 할 수 있어야합니다. 그러나 이는 보증이 아니며 문제가 발생할 수 있습니다.

  2. 나는 Facebook API를 확인했으며 Android SDK를 통해 스트리밍 데이터를 지원하는 것처럼 보이지 않습니다. 즉, 자신의 롤백해야합니다. 그들은 자신의 웹 사이트 (http://developers.facebook.com/docs/reference/api/video/)에서 API를 사용하므로 API를 사용하는 방법을 파악한 다음 데이터를 이해하고 나면 데이터를 웹 서비스로 스트리밍하지 않고 스트리밍해야합니다 하나의 facebook.request 객체.

POST 요청으로 수행하는 방법을 설명하는 블로그 게시물 (http://developers.facebook.com/blog/post/493/)이 있습니다. 특히 블로그에서 인용

동영상을 게시하려면 동영상 파일 첨부 파일이 multipart/form-data 인 https://graph-video.facebook.com/me/videos으로 POST 요청을 실행하십시오.

Java의 핵심 부분을 가져 와서 Java로 변환 할 수있는 PHP 예제가 있습니다.

내가 신발에 있다면 두 번째 접근 방식을 시도합니다. 희망이 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다 –

+0

큰 히프 옵션은 수정 사항이 아닙니다. docs (http://developer.android.com/guide/topics/manifest/application-element.html#largeHeap)에서 '대부분의 앱에서이 기능이 필요하지 않습니다. 향상된 성능을위한 전체 메모리 사용. 이 기능을 사용한다고해서 일부 장치가 총 가용 메모리에 의해 제약을 받기 때문에 사용 가능한 메모리가 고정적으로 증가하는 것을 보장하지는 않습니다. '방탄 응용 프로그램을 만들고 싶다면 스트리밍에 대해 생각해 보는 것이 좋습니다. – brianestey

0

때로는 일식에 사용할 수있는 작업 메모리를 늘려야하지만 eclipse 디렉토리의 마지막 줄에있는 eclipse.ini 파일을 편집하여 512mb가 기본값으로 512mb가 기본이되며 이클립스 메모리를 늘릴 수 있습니다 이것과 당신은 당신의 식에 더 많은 숫양을해야합니다.