如何使用Facebook Android SDK 4.x上传视频到Facebook?

4
我正在尝试将我的Facebook SDK从3.20更改为4.x。使用新的SDK时,视频上传出现问题。
以下是在3.20中有效的代码:
    Request request = Request.newUploadVideoRequest(session, new File(videoPath), callback);
    Bundle params = request.getParameters();
    params.putString("title", albumName);
    params.putString("description", " #SomeTag");
    request.setParameters(params);
    request.executeAsync();

这里是我尝试使用新SDK 4.x的不同方法,但每次都会出现相同的错误:
{FacebookServiceException:httpResponseCode:500,facebookErrorCode:6000,facebookErrorType:FacebookApiException,message:上传您的视频文件时出现问题。请尝试使用另一个文件再试一次。}
1.
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
    Bundle params = request.getParameters();
    params.putString("file_url", videoPath);
    params.putString("title", albumName);
    File videoFile = new File(videoPath);
    ParcelFileDescriptor descriptor = ParcelFileDescriptor.open(videoFile, ParcelFileDescriptor.MODE_READ_ONLY);
    params.putParcelable("source", descriptor);
    params.putString("description", " #SomeTag");
    request.setParameters(params);
    request.executeAsync();

2.

    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
    Bundle params = request.getParameters();
    params.putString("file_url", videoPath);
    params.putString("title", albumName);
    byte[] byteVideo = getFileByteArray(videoPath);
    params.putByteArray("source", byteVideo);
    params.putString("description", " #SomeTag");
    request.setParameters(params);
    request.executeAsync();

3.

    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
    Bundle params = request.getParameters();
    params.putString("file_url", videoPath);
    params.putString("title", albumName);
    params.putString("source", "{video-data}");
    params.putString("description", " #SomeTag");
    request.setParameters(params);
    request.executeAsync();

我希望能得到您的帮助。我在新的SDK中没有找到任何Facebook视频上传示例。


尝试通过意图将视频发送到 Facebook! - Muhammad Babar
2个回答

3
经过1.5天的努力,我终于让它工作了。基本思路是将视频作为multipart/form-data发送,这里我使用了一个byteArray。我从Bhavesh Hirpara在这个问题上的回答中得到了这个想法:Is uploading videos from an SD Card to Facebook possible with the Facebook SDK? 还有一些更像是Facebook Android SDK中的错误的注意事项,它们包括:
  1. 即使FB文档中说要这样做,也不要在请求参数中包含“source”或“file_url”。
  2. 在请求参数中针对某个字符串(如视频文件名)包含视频数据。
下面是可行的代码。
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
    Bundle params = request.getParameters();
    try {
        byte[] data = readBytes(videoPath);
        params.putByteArray("video.mp4", data);
        params.putString("title", albumName);
        params.putString("description", " #SomeTag");
        request.setParameters(params);
        request.executeAsync();
    }
    catch (Exception e) {
        e.printStackTrace();
    }


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

        InputStream inputStream = new FileInputStream(dataPath);
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

        byte[] buffer = new byte[1024];

        int len;
        while ((len = inputStream.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
        }

        return byteBuffer.toByteArray();
    }

1
你的解决方案把整个视频文件都保存在内存中。如果这个视频有100MB怎么办?或者我有什么遗漏吗? - Ilya Gazman

0

试试这个。 Uri videoFileUri = ... ShareVideo = new ShareVideo.Builder() .setLocalUrl(videoUrl) .build(); ShareVideoContent content = new ShareVideoContent.Builder() .setVideo(ShareVideo) .build();


我尝试过,但这对于大型视频不起作用,只适用于12MB以下的视频。这是源代码:https://developers.facebook.com/docs/sharing/android - Barbara Kubroski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接