7

Problem:

My video isn't being uploaded to Facebook.

Question:

How can I upload a video to Facebook?

Note:

I can upload a picture from my gallery.

There are no Exceptions being thrown. I think there is a problem in the line

params.putString("filename", <selectedviedoPath> )

AsyncFacebookRunner mAsyncFbRunner = new AsyncFacebookRunner(mFacebook);
        Bundle params = new Bundle();
        //convert to byte stream
   **FileInputStream is = new FileInputStream(new File(selectedviedoPath));**
   ByteArrayOutputStream bs = new ByteArrayOutputStream();
        int data = 0;
        while((data = is.read()) != -1)
        bs.write(data);

        is.close();
        byte[] raw = bs.toByteArray();
        bs.close();

        params.putByteArray("video", raw);
        params.putString("filename", <selectedviedoPath> );
        mAsyncFbRunner.request("me/videos", params, "POST", new WallPostListener());
dreamcoder
  • 1,233
  • 1
  • 11
  • 25
anoop
  • 782
  • 4
  • 12
  • 35

2 Answers2

5

Below is what i have done and now Works Perfect to Post Video on Facebook.

FacebookVideoPostActivity.java

public class FacebookVideoPostActivity extends Activity {
/** Called when the activity is first created. */

private static Facebook facebook = new Facebook("YOUR_APP_ID"); // App ID For the App
private String permissions[] = {""};  
private String statusString = ""; 
private Button btn1;
private String PATH = "/sdcard/test1.3gp"; // Put Your Video Link Here
private ProgressDialog mDialog ;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btn1 = (Button) findViewById(R.id.button1);
    mDialog = new ProgressDialog(FacebookVideoPostActivity.this);
    mDialog.setMessage("Posting video...");

    btn1.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            facebook.authorize(FacebookVideoPostActivity.this, new String[]{ "user_photos,publish_checkins,publish_actions,publish_stream"},new DialogListener() {                     
                @Override                     
                public void onComplete(Bundle values) {   
                    postVideoonWall(); 

                }                      
                @Override                     
                public void onFacebookError(FacebookError error) {}                      
                @Override                     
                public void onError(DialogError e) {}                      
                @Override                     
                public void onCancel() {}                 
            });

        }
    });
}

public void postVideoonWall() { 
    mDialog.setMessage("Posting ...");
    mDialog.show();
    new Thread(new Runnable() {
        @Override
        public void run() {

            byte[] data = null;
            InputStream is = null;
            String dataMsg = "This video is posted from bla bla bla App";
            Bundle param;

            try {
                is = new FileInputStream(PATH);
                data = readBytes(is);
                param = new Bundle();
                param.putString("message", dataMsg);
                param.putString("filename", "test1.mp4");
                //param.putString("method", "video.upload"); 
                param.putByteArray("video", data);
                AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook);
                mAsyncRunner.request("me/videos", param, "POST", new SampleUploadListener(), null);
            }
            catch (FileNotFoundException e) {
               e.printStackTrace();
            }
            catch (IOException e) {
               e.printStackTrace();
            }
        }
    }).start();

}


private Handler mPostHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        mDialog.dismiss();
        if(msg.what==0){
            Toast.makeText(getApplicationContext(), "Image Posted on Facebook.", Toast.LENGTH_SHORT).show();
        }
        else if(msg.what==1) {
            Toast.makeText(getApplicationContext(), "Responce error.", Toast.LENGTH_SHORT).show();
        }else if(msg.what==2){
            Toast.makeText(getApplicationContext(), "Facebook error.", Toast.LENGTH_SHORT).show();
        }
    }
};



public byte[] readBytes(InputStream inputStream) throws IOException {
    // This dynamically extends to take the bytes you read.
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();

    // This is storage overwritten on each iteration with bytes.
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];

    // We need to know how may bytes were read to write them to the byteBuffer.
    int len = 0;
    while ((len = inputStream.read(buffer)) != -1) {
        byteBuffer.write(buffer, 0, len);
    }

    // And then we can return your byte array.
    return byteBuffer.toByteArray();
}

public class SampleUploadListener extends BaseRequestListener {
    public void onComplete(final String response, final Object state) {
        try {             
            Log.d("Facebook-Example", "Response: " + response.toString());             
            JSONObject json = Util.parseJson(response);             
            mPostHandler.sendEmptyMessage(0);
            // then post the processed result back to the UI thread             
            // if we do not do this, an runtime exception will be generated             
            // e.g. "CalledFromWrongThreadException: Only the original             
            // thread that created a view hierarchy can touch its views."          
        } catch (JSONException e) {            
            mPostHandler.sendEmptyMessage(1);
            Log.w("Facebook-Example", "JSON Error in response");         
        } catch (FacebookError e) { 
            mPostHandler.sendEmptyMessage(2);
            Log.w("Facebook-Example", "Facebook Error: " + e.getMessage());         
        }     
    }      
    @Override     
    public void onFacebookError(FacebookError e, Object state) {         
        // TODO Auto-generated method stub      
    } 
} 

}

Now, Integrate Facebook SDK in your project and do changes as below:

Change Util.java from facebook sdk as below

public static String openUrl(String url, String method, Bundle params)
          throws MalformedURLException, IOException {
        // random string as boundary for multi-part http post
        String strBoundary = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f";
        String endLine = "\r\n";

        OutputStream os;



// ADDED By Shreyash For Publish Video 
// sbmmahajan@gmail.com
// Mo. 919825056129
        // Try to get filename key
          String filename = params.getString("filename");
          // If found
           if (filename != null) {
              // Remove from params
                params.remove("filename");
           }
//===================================================


        if (method.equals("GET")) {
            url = url + "?" + encodeUrl(params);
        }
        Util.logd("Facebook-Util", method + " URL: " + url);
        HttpURLConnection conn =
            (HttpURLConnection) new URL(url).openConnection();
        conn.setRequestProperty("User-Agent", System.getProperties().
                getProperty("http.agent") + " FacebookAndroidSDK");
        if (!method.equals("GET")) {
            Bundle dataparams = new Bundle();
            for (String key : params.keySet()) {
                Object parameter = params.get(key);
                if (parameter instanceof byte[]) {
                    dataparams.putByteArray(key, (byte[])parameter);
                }
            }

            // use method override
            if (!params.containsKey("method")) {
                params.putString("method", method);
            }

            if (params.containsKey("access_token")) {
                String decoded_token =
                    URLDecoder.decode(params.getString("access_token"));
                params.putString("access_token", decoded_token);
            }

            conn.setRequestMethod("POST");
            conn.setRequestProperty(
                    "Content-Type",
                    "multipart/form-data;boundary="+strBoundary);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.connect();
            os = new BufferedOutputStream(conn.getOutputStream());

            os.write(("--" + strBoundary +endLine).getBytes());
            os.write((encodePostBody(params, strBoundary)).getBytes());
            os.write((endLine + "--" + strBoundary + endLine).getBytes());

            if (!dataparams.isEmpty()) {

                for (String key: dataparams.keySet()){
    // ADDED By Shreyash For Publish Video 
// sbmmahajan@gmail.com
// Mo. 919825056129
// os.write(("Content-Disposition: form-data; filename=\"" + key + "\"" + endLine).getBytes());
                    os.write(("Content-Disposition: form-data; filename=\"" + ((filename) != null ? filename : key) + "\"" + endLine).getBytes());
                    os.write(("Content-Type: content/unknown" + endLine + endLine).getBytes());
                    os.write(dataparams.getByteArray(key));
                    os.write((endLine + "--" + strBoundary + endLine).getBytes());

                }
            }
            os.flush();
        }

        String response = "";
        try {
            response = read(conn.getInputStream());
        } catch (FileNotFoundException e) {
            // Error Stream contains JSON that we can parse to a FB error
            response = read(conn.getErrorStream());
        }
        return response;
    }

Put above function in that Util.Java and comment the same function available in it.

Now run the project. If is there any query then let me know.

Enjoy :)

Shreyash Mahajan
  • 23,386
  • 35
  • 116
  • 188
  • i can upload only 3gp video ... can you be able to upload mp4 or any other? – Sanket Kachhela Feb 06 '13 at 19:19
  • @SanketKachhela: Have you seen my code in answer? I am able to upload mp4 video as well. It the video is in mp4 format then it will take time to upload it as it is big in size. But you will defiantly get it on to the wall post in some minutes. – Shreyash Mahajan Feb 07 '13 at 05:38
  • when i try to upload mp4 video i am getting notification like video could not be processed in facebook. is there any solution? – Sanket Kachhela Feb 07 '13 at 05:54
  • please post question on SO and put your code and Screen shot so we can help you. – Shreyash Mahajan Feb 07 '13 at 06:04
  • @iDroidExplorer i implement ur coding but i am getting error in this 2 line mAsyncRunner.request("me/videos", param, "POST", new SampleUploadListener(), null); and public class SampleUploadListener extends BaseRequestListener . i cant used BaseRequestListener any help – Jagan Feb 20 '13 at 12:52
  • @iDroidExplorer Thank u so much after long hours i got it. – Manoj Kumar Mar 27 '13 at 10:30
1

The API call for uploading videos is different to normal Graph API queries. See the facebook tutorial here: https://developers.facebook.com/blog/post/493/

Niraj Shah
  • 15,087
  • 3
  • 41
  • 60