¿Es posible cargar videos desde una tarjeta SD a Facebook con el SDK de Facebook?

¿Podemos subir videos desde la tarjeta SD de un dispositivo Android a una cuenta de Facebook a través del SDK de Facebook?

Si es así, ¿cuáles son algunos ejemplos simples?

¡Sí, es posible! Después de dos días de intentar e investigar, pude hacerlo. Aquí está el código:

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

donde fbRequestListener() es una implementación de AsyncFacebookRunner.RequestListener() y readBytes() es una función de convertir su archivo de video a byte[] . La cadena dataName debe incluir una extensión de archivo válida (3gp, mp4, etc.). El código es el siguiente:

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

Obtuve esta función a partir de esta respuesta .

Por supuesto, debe tener el último SDK de Facebook, pero tenemos que aplicar este parche para corregir el {"error":{"type":"OAuthException","message":"(#352) Video file format is not supported"}} admitió el error de respuesta de cadena {"error":{"type":"OAuthException","message":"(#352) Video file format is not supported"}} .

¡Y eso es! ¡Espero que esto ayude!

Con el lanzamiento del nuevo SDK 3.5 de Facebook, la carga de videos se ha simplificado. Si usa sdk 3.5 o superior, aquí está el código para subir videos a 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 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(); } 

Después de parchear el archivo Util, no obtuvo el resultado.

Me enfrenté al problema mencionado por Softy.

Intenté con esto en Android … Ahora funciona con éxito … el video se muestra en mi pared después de algún tiempo (dentro de 1 minuto) … (Puede ser, Facebook fue una actualización de datos …)

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

En el lanzamiento del nuevo SDK de Facebook, hay algunos cambios en la carga de videos en la página de Facebook o en la pared.

Aquí hay un código que he usado para subir videos en la página de Facebook o en Facebook.

Su método onActivityResult() debería ser así

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

Aquí está todo el método utilizado en 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()); } 

Aquí está la clase GetFilePathFromDevice utilizada en onActivityResult() para obtener la ruta del archivo desde el URI.

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