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

3
我正在使用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]
null


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

我遇到了这个问题。你找到解决方案了吗?你是如何发出请求的? - howettl
没有,我还没有找到解决方案。 - l33t
1
我还创建了一个问题;我相信我遇到的问题和你一样,但我提供了更多的细节:http://stackoverflow.com/q/15144102/758458 - howettl
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像素的图片。在我的代码中,我将位图缩放到该尺寸限制内,然后再进行上传,这极大地提高了性能。


谢谢你的回答。问题是我们在使用Facebook SDK 3.0时遇到了麻烦。虽然使用SDK有很多优点,但上传图片时出现了奇怪且不定期的问题。我们需要找出错误来自哪里。是Facebook SDK还是底层HTTP库(即Java/Android)?使用Facebook SDK上传图片也可以,但并不总是有效。 - l33t
问题出现在Facebook SDK使用的HttpURLConnection上,我的解决方案改用不会出现这个问题的Apache HTTP客户端。我还更新了答案以添加错误重试功能。 - howettl
那么最终的解决方案是修改Facebook SDK以使用Apache HTTP客户端,对吗? - l33t
2
玩得开心,挖掘方法调用链以获取实际的HTTP调用。这有点极端。 - howettl
关于 Facebook 最大图片尺寸为720x720的信息解决了我的问题。 - Morten Holmgaard

2

@i33t: 我也曾面临过IoException和FacebookException的问题。在我的情况下,问题出在在UI线程上运行网络操作。

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

解决方案:确保在工作线程上执行此操作。


我相信Android 4+甚至不允许在UI线程上进行网络操作。你说的很有道理。然而,自从我升级到Facebook SDK 3.0.1以来,我就没有看到过这个错误。 - l33t

0
我遇到了一个问题。 我的Facebook SDK版本是3.5.2。这个问题只能在安装有4.3操作系统的三星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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接