Is uploading videos from an SD Card to Facebook po

2019-01-03 02:36发布

Can we upload videos from an Android device's SD Card to a Facebook account via the Facebook SDK?

If so, what are some simple examples?

4条回答
老娘就宠你
2楼-- · 2019-01-03 03:05

Yes, it is possible! After two days of trying and researching, I was able to do it. Here's the code:

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

where fbRequestListener() is an implementation of AsyncFacebookRunner.RequestListener() and readBytes() is a function of converting your video file to byte[]. The dataName string should include a valid file extension (3gp, mp4, etc.). The code is as follows:

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

I got this function from this answer.

Of course, you need to have the latest Facebook SDK, but we need to apply this patch to fix the {"error":{"type":"OAuthException","message":"(#352) Video file format is not supported"}} string response error.

And that's it! I hope this helps!

查看更多
▲ chillily
3楼-- · 2019-01-03 03:06

After patching Util file, did not get result.

I faced problem mentioned by softy.

I tried with this in android... Now works successfully.. video displayed on my wall after sometime (within 1 min).. (May be, facebook was refreshing data..)

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

    }

}
查看更多
放荡不羁爱自由
4楼-- · 2019-01-03 03:09

With the release of new facebook SDK 3.5, video uploading has been made easier. If you are using sdk 3.5 or above here is the code for uploading video to 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();
        }
查看更多
ゆ 、 Hurt°
5楼-- · 2019-01-03 03:23

In release of new facebook SDK, there are some changes in video uploading to facebook page or wall.

Here is code i have used for uploading video on Facebook page or facebook wall.

Your onActivityResult() method should be like this

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

Here is all method used in 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());
}

Here is GetFilePathFromDevice class used in onActivityResult() for getting file path from 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());
}
}
查看更多
登录 后发表回答