使用Facebook SDK将video从SD卡上传到Facebook?

我们可以通过Facebook SDK将Android设备的SD卡上的video上传到Facebook帐户吗?

如果是这样,那么一些简单的例子呢?

是的,这是可能的! 经过两天的努力和研究,我能够做到这一点。 代码如下:

byte[] data = null; String dataPath = "/mnt/sdcard/KaraokeVideos/myvideo.3gp"; String dataMsg = "Your video description here."; Bundle param; facebook = new Facebook(FB_APP_ID); AsyncFacebookRunner mAsyncRunner = new AsyncFacebookRunner(facebook); InputStream is = null; try { is = new FileInputStream(dataPath); data = readBytes(is); param = new Bundle(); param.putString("message", dataMsg); param.putString("filename", dataName); param.putByteArray("video", data); mAsyncRunner.request("me/videos", param, "POST", new fbRequestListener(), null); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

其中fbRequestListener()fbRequestListener()的实现, readBytes()是将video文件转换为byte[]的函数。 dataNamestring应包含有效的文件扩展名(3gp,mp4等)。 代码如下:

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

我从这个答案得到这个function。

当然,你需要有最新的Facebook SDK,但我们需要应用这个补丁来修复{"error":{"type":"OAuthException","message":"(#352) Video file format is not supported"}}string响应错误。

而就是这样! 我希望这有帮助!

随着新的Facebook SDK 3.5的发布,video上传变得更容易。 如果您使用sdk 3.5或以上,这里是上传video到Facebook的代码

 //Path to the video, Ex: path = Environment.getExternalStorageDirectory() + File.separator + "myVideo.mp4"; String path; //get the current active facebook session Session session = Session.getActiveSession(); //If the session is open if(session.isOpened()) { //Get the list of permissions associated with the session List<String> permissions = session.getPermissions(); //if the session does not have video_upload permission if(!permissions.contains("video_upload")) { //Get the permission from user to upload the video to facebook Session.NewPermissionsRequest newPermissionsRequest = new Session .NewPermissionsRequest(this, Arrays.asList("video_upload")); session.requestNewReadPermissions(newPermissionsRequest); } //Create a new file for the video File file = new File(path); try { //create a new request to upload video to the facebook Request videoRequest = Request.newUploadVideoRequest(session, file, new Request.Callback() { @Override public void onCompleted(Response response) { if(response.getError()==null) { Toast.makeText(MainActivity.this, "video shared successfully", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(MainActivity.this, response.getError().getErrorMessage(), Toast.LENGTH_SHORT).show(); } } }); //Execute the request in a separate thread videoRequest.executeAsync(); } catch (FileNotFoundException e) { e.printStackTrace(); } } //Session is not open else { Toast.makeText(getApplicationContext(), "Please login to facebook first", Toast.LENGTH_SHORT).show(); } 

修补Util文件后,没有得到结果。

我遇到了软弱提到的问题。

我尝试了这个在Android中…现在工作成功..video显示在我的墙上后(1分钟内)..(可能是,Facebook刷新数据..)

 String path="\mnt\sdcard\test.mp4"; if (new File(path).exists()) { try { byte[] data = null; String dataPath = new File(path).getAbsolutePath(); Log.e("", dataPath); String dataMsg = "It is the short movie created"; Bundle param; InputStream is = null; try { is = new FileInputStream(dataPath); data = readBytes(is); param = new Bundle(); // param.putString("filename", "" + new // File(path).getName()); // param.putString("mimeType", "video/mp4"); param.putString("message", dataMsg); param.putString("title", "title"); param.putString("contentType", "video/quicktime"); param.putByteArray("video.mov", data); Utility.mAsyncRunner.request("me/videos", param, "POST", new FBRequestListener(), null); Toast.makeText(getContext(), "Uploading...", Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } } else { Toast.makeText(getContext(), "No videos found in these dates", Toast.LENGTH_SHORT).show(); } 

FBRequestListener.java

 public class FBRequestListener implements RequestListener { @Override public void onComplete(String response, Object state) { Log.e("response", response); // Log.e("state", state.toString()); } @Override public void onIOException(IOException e, Object state) { Log.e("", "onIOException"); e.printStackTrace(); } @Override public void onFileNotFoundException(FileNotFoundException e, Object state) { Log.e("", "onFileNotFoundException"); e.printStackTrace(); } @Override public void onMalformedURLException(MalformedURLException e, Object state) { Log.e("", "onMalformedURLException"); e.printStackTrace(); } @Override public void onFacebookError(FacebookError e, Object state) { Log.e("", "onFacebookError"); e.printStackTrace(); } } 

在新版Facebook SDK的发布中,video上传到Facebook页面或墙壁上有一些变化。

这里是我用来在Facebook页面或Facebook墙上上传video的代码。

你的onActivityResult()方法应该是这样的

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == CAMERA_VIDEO && resultCode == Activity.RESULT_OK){ String selectedVideoFilePath = GetFilePathFromDevice.getPath(this, data.getData()); final byte[] datas = readBytes(selectedVideoFilePath); PostVideo(datas, selectedVideoFilePath); } } 

这里是onActivityResult().使用的所有方法onActivityResult().

 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(); } public void PostVideo(byte[] VideoBytes, String filePath) { String url; url = "/me/videos"; AccessToken token = AccessToken.getCurrentAccessToken(); if (token != null) { Bundle param = new Bundle(); param.putByteArray("video." + getFileExt(filePath), VideoBytes); param.putString("description", "sample video"); new GraphRequest(token,url, param, HttpMethod.POST, new GraphRequest.Callback() { public void onCompleted(GraphResponse response) { Log.e("New Post", "Res =" + response.toString()); dialog.dismiss(); if (response != null && response.getJSONObject() != null && response.getJSONObject().has("id")) { Log.e("New Post", "Success"); Toast.makeText(NewPostActivity.this, "Video posted successfully.", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(NewPostActivity.this, "Error in posting Video.", Toast.LENGTH_SHORT).show(); } setResult(Activity.RESULT_OK, new Intent()); finish(); } }).executeAsync(); } } public static String getFileExt(String fileName) { return fileName.substring((fileName.lastIndexOf(".") + 1), fileName.length()); } 

这里是在onActivityResult()用于从URI获取文件path的GetFilePathFromDevice类。

 @SuppressLint("NewApi") public final class GetFilePathFromDevice { /** * Get file path from URI * * @param context context of Activity * @param uri uri of file * @return path of given URI */ public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[]{split[1]}; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address if (isGooglePhotosUri(uri)) return uri.getLastPathSegment(); return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int index = cursor.getColumnIndexOrThrow(column); return cursor.getString(index); } } finally { if (cursor != null) cursor.close(); } return null; } public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } public static boolean isGooglePhotosUri(Uri uri) { return "com.google.android.apps.photos.content".equals(uri.getAuthority()); } }