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)

当我尝试从我的应用程序将视频上​​传到 Facebook 时。我收到此错误消息。我的视频大小约为 15-20 MB。我的代码在较低版本中正常运行。我仅在 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) {


        }

    }
4

3 回答 3

2

在 Android Manifest 文件中的 application 标签下添加 android:largeHeap="true"。这增加了您可以使用的可用内存空间。但是,这只适用于 API 11+。

于 2013-06-21T07:38:32.247 回答
0

基本上,您无法按照您尝试的方式进行操作。因为您正在将整个文件读入内存,所以您在内存到达网络之前就已经耗尽了您可以使用的内存。

有几个选项可以帮助您解决此问题:

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

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

这里有一篇博文(http://developers.facebook.com/blog/post/493/)描述了如何将其作为 POST 请求进行。具体来说,引用自博客

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

有一个 PHP 示例,您可以从中取出关键部分并转换为 Java。

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

于 2013-06-21T07:42:45.493 回答
0

有时您需要增加 eclipse 可用的工作内存,但编辑 eclipse 目录中的 eclipse.ini 文件,最后一行,值默认为 512m,这意味着只有 512mb 被用作 eclipse 的内存,增加这个,你会对你的日食有更多的影响。

于 2013-06-21T09:12:56.653 回答