使用Facebook Android SDK 3.0上传照片时出现间歇性SSL错误

时间:2013-01-04 17:50:24

标签: android facebook facebook-graph-api

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

请参阅Request.java中的功能toHttpConnection

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

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

javax.net.ssl.SSLException:写入错误:ssl = 0x4f033008:系统调用期间的I / O错误,管道损坏 javax.net.ssl.SSLException:写入错误:ssl = 0x4f033008:系统调用期间的I / O错误,管道损坏 写入错误:ssl = 0x4f033008:系统调用期间的I / O错误,管道损坏 [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中的错误吗?有没有人遇到过这个?更重要的是,我该如何解决?

3 个答案:

答案 0 :(得分: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像素。在我的代码中,我在进行上传之前将位图缩放到该大小限制内,这极大地提高了性能。

答案 1 :(得分:2)

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

如果你真的打印了堆栈跟踪,你就会得到它。

解决方案确保在WorkerThread上执行此操作

答案 2 :(得分:0)

我正在解决这个问题。 我的Facebook SDK版本是3.5.2。这个问题只能在带有4.3操作系统版本的Samsung Note2上重现。

这个问题非常奇怪,因为它一次成功,失败一次成功一次,失败一次......

原因异常消息如下:

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)