4

I am trying to change my Facebook SDK from 3.20 to 4.x. The video upload gets broken with the new SDK.

Here is the code that is working in 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();

Here are the different things I have tried with the new SDK 4.x. But every time I get the same error:

{FacebookServiceException: httpResponseCode: 500, facebookErrorCode: 6000, facebookErrorType: FacebookApiException, message: There was a problem uploading your video file. Please try again with another file.}

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();

I'd appreciate any help. I have not found any video upload sample from Facebook either for the new SDK.

2 Answers2

3

After spending 1.5 days, I finally have it working. The basic idea is to send the video as multipart/form-data, in this case I am using a byteArray. I got this idea from the answer given by Bhavesh Hirpara on this question : Is uploading videos from an SD Card to Facebook possible with the Facebook SDK?

There are couple of more caveats, which feel more like bugs in Facebook Android SDK, but they are:

  1. Do no include "source" or "file_url" in the request parameters even though the FB documentation says so.
  2. Include the video data against some String (e.g. video file name) in the request parameters.

Here is the working code.

    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();
    }
Community
  • 1
  • 1
  • 1
    In your solution you keep the entire video file in memory. What if the video is 100MB? OR am I missing some thing? – Ilya Gazman Oct 18 '15 at 14:13
0

try this. Uri videoFileUri = ... ShareVideo = new ShareVideo.Builder() .setLocalUrl(videoUrl) .build(); ShareVideoContent content = new ShareVideoContent.Builder() .setVideo(ShareVideo) .build();

Anny
  • 509
  • 1
  • 5
  • 14
  • I tried but this does not work for large videos, only video upto 12MB. Here is the source : https://developers.facebook.com/docs/sharing/android – Barbara Kubroski May 25 '15 at 21:22