在Android上传video到Facebook

问题

我的video没有被上传到Facebook。

问题

我怎样才能把video上传到Facebook?

注意

我可以从我的画廊上传图片。

没有引发exception。 我觉得这个行有问题

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

以下是我所做的,现在完美的作品,在Facebook上发布video。

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 // eg "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 } } 

}

现在,将Facebook SDK集成到您的项目中,并进行如下更改:

如下所示从facebook sdk更改Util.java

 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; } 

把上面的函数放在Util.Java中,并注释它可用的相同函数。

现在运行该项目。 如果有任何疑问,请让我知道。

请享用 :)

上传video的API调用与普通的Graph API查询不同。 请参阅这里的Facebook教程: https : //developers.facebook.com/blog/post/493/