在 Android 上通过 Graph API 上传视频时出错
Error uploading video via Graph API on Android
我正在使用 Graph API 开发概念验证 Android 应用程序。我正在尝试将视频上传到我的 Facebook 应用程序的相册。
我使用这部分代码来这样做:
String dataName = new File(getRealPathFromURI(this,data.getData())).getName();
Toast.makeText(this,dataName,Toast.LENGTH_LONG).show();
params.putString("filename", new File(getRealPathFromURI(this,data.getData())).getName());
params.putByteArray("source",k);
/* make the API call */
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"/"+sProfile.getId()+"/videos",
params,
HttpMethod.POST,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
TextView textView = (TextView) findViewById(R.id.textView2);
textView.setText(response.toString()+" "+k.length);
Log.v("Response:",response.toString());
}
}
).executeAsync();
尽管如此,这 Android 相当于 Facebook 的 suggested method 并且我正在尝试上传工作 .mp4
文件,但我收到此错误。
{Response: responseCode: 400, graphObject: null, error: {HttpStatus: 400,errorCode: 352, errorType: OAuthException, errorMessage: Sorry, the video file you selected is in a format that we don't support.}}
在我看来,Android Facebook SDK 中的 GraphRequest.java 有一个错误,导致上传视频的文件名被设置为 "source"。
在这里,在 GraphRequest.java 的第 2166 行和第 2167 行,我们看到:
public void writeBytes(String key, byte[] bytes) throws IOException {
writeContentDisposition(key, key, "content/unknown");
和第 2245-2248 行同一文件中 writeContentDisposition 的参数:
public void writeContentDisposition(
String name,
String filename,
String contentType
)
在 params.putByteArray("source",k);
的情况下,应该将文件名设置为 "source",没有文件扩展名供 facebook 使用。
添加 params.putString("filename", <FILENAME>);
根本行不通,因为这不会更改错误分配给 source
.
的文件名
在Graph API 2.5 video reference中我们可以读到以下内容:
When including a source parameter, you should include a filename with the correct extension that indicates the type of file container.
有趣的是,在 2.6 video reference 中并没有写这样的东西。
我的问题是:
- GraphRequest.java真的有bug吗?或者 2.6 视频参考是否正确,文件名不再重要?
- 如果有错误,当我通过 build.gradle 依赖项使用 API 时,如何更改 class?
- 如果没有错误,我的上传脚本有什么问题,如何防止 Facebook 给我格式错误响应?
。
看来 Facebook Android SDK 中确实存在错误。
作为变通方法,我使用了 Android Asynchronous Http Client,并创建了以下方法:
void uploadVideo(String name, InputStream is, String fileName){
AsyncHttpClient client = new AsyncHttpClient();
RequestParams rp = new RequestParams();
rp.put("access_token",AccessToken.getCurrentAccessToken().getToken());
rp.put("name",name);
rp.put("source",is,fileName);
client.post(this, "https://graph-video.facebook.com/me/videos", rp, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
//something...
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
//something...
}
});
}
一切都按预期进行。
我正在使用 Graph API 开发概念验证 Android 应用程序。我正在尝试将视频上传到我的 Facebook 应用程序的相册。
我使用这部分代码来这样做:
String dataName = new File(getRealPathFromURI(this,data.getData())).getName();
Toast.makeText(this,dataName,Toast.LENGTH_LONG).show();
params.putString("filename", new File(getRealPathFromURI(this,data.getData())).getName());
params.putByteArray("source",k);
/* make the API call */
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"/"+sProfile.getId()+"/videos",
params,
HttpMethod.POST,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
TextView textView = (TextView) findViewById(R.id.textView2);
textView.setText(response.toString()+" "+k.length);
Log.v("Response:",response.toString());
}
}
).executeAsync();
尽管如此,这 Android 相当于 Facebook 的 suggested method 并且我正在尝试上传工作 .mp4
文件,但我收到此错误。
{Response: responseCode: 400, graphObject: null, error: {HttpStatus: 400,errorCode: 352, errorType: OAuthException, errorMessage: Sorry, the video file you selected is in a format that we don't support.}}
在我看来,Android Facebook SDK 中的 GraphRequest.java 有一个错误,导致上传视频的文件名被设置为 "source"。
在这里,在 GraphRequest.java 的第 2166 行和第 2167 行,我们看到:
public void writeBytes(String key, byte[] bytes) throws IOException {
writeContentDisposition(key, key, "content/unknown");
和第 2245-2248 行同一文件中 writeContentDisposition 的参数:
public void writeContentDisposition(
String name,
String filename,
String contentType
)
在 params.putByteArray("source",k);
的情况下,应该将文件名设置为 "source",没有文件扩展名供 facebook 使用。
添加 params.putString("filename", <FILENAME>);
根本行不通,因为这不会更改错误分配给 source
.
在Graph API 2.5 video reference中我们可以读到以下内容:
When including a source parameter, you should include a filename with the correct extension that indicates the type of file container.
有趣的是,在 2.6 video reference 中并没有写这样的东西。
我的问题是:
- GraphRequest.java真的有bug吗?或者 2.6 视频参考是否正确,文件名不再重要?
- 如果有错误,当我通过 build.gradle 依赖项使用 API 时,如何更改 class?
- 如果没有错误,我的上传脚本有什么问题,如何防止 Facebook 给我格式错误响应?
。
看来 Facebook Android SDK 中确实存在错误。
作为变通方法,我使用了 Android Asynchronous Http Client,并创建了以下方法:
void uploadVideo(String name, InputStream is, String fileName){
AsyncHttpClient client = new AsyncHttpClient();
RequestParams rp = new RequestParams();
rp.put("access_token",AccessToken.getCurrentAccessToken().getToken());
rp.put("name",name);
rp.put("source",is,fileName);
client.post(this, "https://graph-video.facebook.com/me/videos", rp, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
//something...
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
//something...
}
});
}
一切都按预期进行。