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());
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
// [email protected]
// 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
// [email protected]
// 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 :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With