在Android

时间:2016-04-13 12:34:40

标签: android facebook-graph-api video facebook-android-sdk uploading

我正在使用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存在一个错误,导致视频文件名被上传为“源”。

这里,在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中,我们可以阅读以下内容:

  

当包含source参数时,应该包含一个带有正确扩展名的文件名,指示文件容器的类型。

有趣的是,在2.6 video reference中,没有任何类似的东西写在那里。

我的问题是:

  1. GraphRequest.java中确实存在错误吗?或者2.6视频参考是否正确,文件名不再重要了?
  2. 如果有错误,当我通过build.gradle依赖项使用API​​时,如何更改类?
  3. 如果没有错误,我的上传脚本有什么问题,如何防止Facebook给我格式错误回复?

1 个答案:

答案 0 :(得分:0)

所以,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...
        }
    });
}

一切都按预期运作。