3

我正在使用 Facebook Android SDK 3.0 将照片上传到我的相册。一切正常,但有时第一次上传失败并出现一些意外的 SSL 错误。

请参阅Request.javatoHttpConnection中的函数。

try {
        connection = createConnection(url);

        serializeToUrlConnection(requests, connection);
    } catch (IOException e) {
        // THIS IS WHERE THE ERROR ORIGINATES FROM!
        throw new FacebookException("could not construct request body", e);
    } catch (JSONException e) {
        throw new FacebookException("could not construct request body", e);
    }

将鼠标悬停e在 Eclipse 中会显示以下信息:

javax.net.ssl.SSLException:写入错误:ssl=0x4f033008:系统调用期间的 I/O 错误,管道损坏 javax.net.ssl.SSLException:写入错误:ssl=0x4f033008:系统调用期间的 I/O 错误,管道损坏Write error: ssl=0x4f033008: I/O error during system call, Broken pipe [1277468208, 0, 1279934152, 48, 1280860304, 26, 1280860480, 58, 1280859576, 11, 1280859696, 4, 1277492792, 1, 1280859640, 7, 1280233152, 169, 1280233264, 36, 1280230744, 6, 1280236632, 0, 1280236576, 0, 1280238568, 6, 1280238512, 2, 1278731744, 21, 1279835640, 23, 1278097880, 2, 1279841920, 28, 1279843376, 2, 1277300032, 6]空

这是 SDK 中的错误吗?有没有其他人遇到过这个?更重要的是,我该如何解决?

4

3 回答 3

3

几乎已经准备好接受我之前的(删除的)答案,直到我看到这篇文章:http: //vikaskanani.wordpress.com/2011/01/11/android-upload-image-or-file-using-http -post-multi-part/

我决定试一试,它似乎奏效了!这是我的代码:

for (Bitmap b : bitmaps) {
    // id is just a string
    String response = executeUpload(b, id);

    // do something with the response
}

private String executeUpload(Bitmap b, String id) throws MalformedURLException, IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    b.compress(CompressFormat.PNG, 100, baos);
    byte[] data = baos.toByteArray();

    HttpPost postRequest = new HttpPost("https://graph.facebook.com/me/photos");
    HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(params, 3000);
    HttpClient httpClient = new DefaultHttpClient();
    httpClient.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(2, true));

    ByteArrayBody bab = new ByteArrayBody(data, id + ".png");
    MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
    reqEntity.addPart("access_token", new StringBody(activeFacebookAccessToken));
    reqEntity.addPart("message", new StringBody(""));
    reqEntity.addPart("picture", bab);
    postRequest.setEntity(reqEntity);
    HttpResponse response = httpClient.execute(postRequest);
    BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
    String s;
    StringBuilder builder = new StringBuilder();
    while ((s = reader.readLine()) != null) {
        builder = builder.append(s);
    }

    return builder.toString();
}

如上面链接中所述,您必须安装最新版本HttpClient(位于http://hc.apache.org/downloads.cgi)。

另一个需要注意的重要事项是,Facebook 在任一维度上支持的最大图像尺寸为 720 像素。在我的代码中,我在上传之前将位图缩放到该大小限制内,这大大提高了性能。

于 2013-03-06T23:42:42.290 回答
2

@i33t:我遇到了与 IoException 和 FacebookException 相同的问题。在我的情况下,问题在于在 UI 线程上运行网络操作。

如果你真的打印堆栈跟踪,你会得到这个。

解决方法:一定要在WorkerThread上执行这个操作

于 2013-08-29T06:49:15.517 回答
0

我正在解决这个问题。我的 Facebook SDK 版本是 3.5.2。而且这个问题只能在三星Note2 4.3 os版本上重现。

这个问题表现得很奇怪,因为它表现为成功一次,失败一次然后成功一次,失败一次..

原因异常消息如下:

javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x59b399c8: Failure in SSL library, usually a protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x5d887c58:0x00000000)
于 2014-11-21T10:06:43.483 回答