如何使用 Facebook Android SDK 4.x 将视频上传到 Facebook?
How to upload videos to Facebook using Facebook Android SDK 4.x?
我正在尝试将我的 Facebook SDK 从 3.20 更改为 4.x。新 SDK 无法上传视频。
这是在 3.20 中运行的代码:
Request request = Request.newUploadVideoRequest(session, new File(videoPath), callback);
Bundle params = request.getParameters();
params.putString("title", albumName);
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
以下是我尝试使用新 SDK 4.x 的不同之处。但是每次我得到同样的错误:
{FacebookServiceException:httpResponseCode:500,facebookErrorCode:6000,facebookErrorType:FacebookApiException,消息:上传您的视频文件时出现问题。请使用其他文件重试。}
1.
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
Bundle params = request.getParameters();
params.putString("file_url", videoPath);
params.putString("title", albumName);
File videoFile = new File(videoPath);
ParcelFileDescriptor descriptor = ParcelFileDescriptor.open(videoFile, ParcelFileDescriptor.MODE_READ_ONLY);
params.putParcelable("source", descriptor);
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
2.
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
Bundle params = request.getParameters();
params.putString("file_url", videoPath);
params.putString("title", albumName);
byte[] byteVideo = getFileByteArray(videoPath);
params.putByteArray("source", byteVideo);
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
3.
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
Bundle params = request.getParameters();
params.putString("file_url", videoPath);
params.putString("title", albumName);
params.putString("source", "{video-data}");
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
如果有任何帮助,我将不胜感激。对于新的 SDK,我还没有从 Facebook 找到任何视频上传示例。
试试这个。
Uri videoFileUri = ...
ShareVideo = new ShareVideo.Builder()
.setLocalUrl(videoUrl)
。建造();
ShareVideoContent 内容 = 新 ShareVideoContent.Builder()
.setVideo(分享视频)
.build();
花了 1.5 天后,我终于让它工作了。基本思路是将视频作为 multipart/form-data 发送,在本例中我使用的是 byteArray。我从 Bhavesh Hirpara 对这个问题的回答中得到了这个想法:
Is uploading videos from an SD Card to Facebook possible with the Facebook SDK?
还有一些注意事项,感觉更像是 Facebook Android SDK 中的错误,但它们是:
- 不要在请求参数中包含 "source" 或 "file_url",即使 FB 文档这样说也是如此。
- 在请求参数中包含针对某些字符串(例如视频文件名)的视频数据。
这是工作代码。
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
Bundle params = request.getParameters();
try {
byte[] data = readBytes(videoPath);
params.putByteArray("video.mp4", data);
params.putString("title", albumName);
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
}
catch (Exception e) {
e.printStackTrace();
}
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();
}
我正在尝试将我的 Facebook SDK 从 3.20 更改为 4.x。新 SDK 无法上传视频。
这是在 3.20 中运行的代码:
Request request = Request.newUploadVideoRequest(session, new File(videoPath), callback);
Bundle params = request.getParameters();
params.putString("title", albumName);
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
以下是我尝试使用新 SDK 4.x 的不同之处。但是每次我得到同样的错误:
{FacebookServiceException:httpResponseCode:500,facebookErrorCode:6000,facebookErrorType:FacebookApiException,消息:上传您的视频文件时出现问题。请使用其他文件重试。}
1.
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
Bundle params = request.getParameters();
params.putString("file_url", videoPath);
params.putString("title", albumName);
File videoFile = new File(videoPath);
ParcelFileDescriptor descriptor = ParcelFileDescriptor.open(videoFile, ParcelFileDescriptor.MODE_READ_ONLY);
params.putParcelable("source", descriptor);
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
2.
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
Bundle params = request.getParameters();
params.putString("file_url", videoPath);
params.putString("title", albumName);
byte[] byteVideo = getFileByteArray(videoPath);
params.putByteArray("source", byteVideo);
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
3.
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
Bundle params = request.getParameters();
params.putString("file_url", videoPath);
params.putString("title", albumName);
params.putString("source", "{video-data}");
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
如果有任何帮助,我将不胜感激。对于新的 SDK,我还没有从 Facebook 找到任何视频上传示例。
试试这个。 Uri videoFileUri = ... ShareVideo = new ShareVideo.Builder() .setLocalUrl(videoUrl) 。建造(); ShareVideoContent 内容 = 新 ShareVideoContent.Builder() .setVideo(分享视频) .build();
花了 1.5 天后,我终于让它工作了。基本思路是将视频作为 multipart/form-data 发送,在本例中我使用的是 byteArray。我从 Bhavesh Hirpara 对这个问题的回答中得到了这个想法: Is uploading videos from an SD Card to Facebook possible with the Facebook SDK?
还有一些注意事项,感觉更像是 Facebook Android SDK 中的错误,但它们是:
- 不要在请求参数中包含 "source" 或 "file_url",即使 FB 文档这样说也是如此。
- 在请求参数中包含针对某些字符串(例如视频文件名)的视频数据。
这是工作代码。
AccessToken accessToken = AccessToken.getCurrentAccessToken();
GraphRequest request = GraphRequest.newPostRequest(accessToken, "me/videos", null, callback);
Bundle params = request.getParameters();
try {
byte[] data = readBytes(videoPath);
params.putByteArray("video.mp4", data);
params.putString("title", albumName);
params.putString("description", " #SomeTag");
request.setParameters(params);
request.executeAsync();
}
catch (Exception e) {
e.printStackTrace();
}
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();
}