API21以下版本的文件下载失败

问题描述

我的应用从我的网站下载简单的文本文件。对于 API21 及以上,一切正常,但对于 API18 和 API 19,下载失败。该应用程序使用下载管理器,但当失败时,我编写了此替代代码以试图找出问题所在:

public int DownloadFiles(){
    int gotFileOK=1;//indicates download OK
    File folder = new File(Environment.getExternalStorageDirectory() + File.separator + "TestAMJ");
    if (folder.exists()) {
        Log.v("sTag","the folder |"+folder+"| exists");
    } else {
        Log.v("sTag","the folder |"+folder+"| does not exist");
        File dirsetFile = new File(Environment.getExternalStorageDirectory() + File.separator + "TestAMJ");
        dirsetFile.mkdirs();
    }
    File tempFil = new File(Environment.getExternalStorageDirectory() + File.separator + "TestAMJ" + File.separator + "test.txt");
    try {
        URL u = new URL("https://aboutmyjourney.com/wp-content/uploads/developerlist.txt");
            InputStream is = u.openStream();
            DataInputStream dis = new DataInputStream(is);
        byte[] buffer = new byte[1024];
        int length;
        FileOutputStream fos = new FileOutputStream(tempFil);
        while ((length = dis.read(buffer))>0) {
            fos.write(buffer,length);
        }
    } catch (IOException ioe) {
        gotFileOK=2;
        Log.v("sTag","io error",ioe);
    }
    return(gotFileOK);
}

和以前一样,这在 API21 或更高版本上运行良好。但是,使用 API19 模拟器时,我收到此错误消息:

04-23 15:48:46.798 5167-5183/com.example.downloadalternative V/sTag:io 错误 java.net.ConnectException:无法连接到 aboutmyjourney.com/2001:8d8:100f:f000::2fa(端口 443):连接失败:ETIMEDOUT(连接超时) 在 libcore.io.IoBridge.connect(IoBridge.java:114) 在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 在 java.net.socket.connect(Socket.java:843) 在 com.android.okhttp.internal.Platform.connectSocket(Platform.java:131) 在 com.android.okhttp.Connection.connect(Connection.java:101) 在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294) 在 com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179) 在 com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246) 在 java.net.URL.openStream(URL.java:470) 在 com.example.downloadalternative.DownloadActivity.DownloadFiles(DownloadActivity.java:69) 在 com.example.downloadalternative.DownloadActivity$1.run(DownloadActivity.java:43) 在 java.lang.Thread.run(Thread.java:841) 引起:libcore.io.ErrnoException:连接失败:ETIMEDOUT(连接超时) 在 libcore.io.Posix.connect(本机方法) 在 libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 在 libcore.io.IoBridge.connectErrno(IoBridge.java:127) 在 libcore.io.IoBridge.connect(IoBridge.java:112) 在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 在 java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 在 java.net.socket.connect(Socket.java:843) 在 com.android.okhttp.internal.Platform.connectSocket(Platform.java:131) 在 com.android.okhttp.Connection.connect(Connection.java:101) 在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294) 在 com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255) 在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:296) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:179) 在 com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:246) 在 java.net.URL.openStream(URL.java:470) 在 com.example.downloadalternative.DownloadActivity.DownloadFiles(DownloadActivity.java:69) 在 com.example.downloadalternative.DownloadActivity$1.run(DownloadActivity.java:43) 在 java.lang.Thread.run(Thread.java:841) 04-23 15:48:46.798 5167-5183/com.example.downloadalternative V/sTag:结果是2

使用 API18 我得到了:

04-23 16:02:33.322 1982-2019/com.example.downloadalternative V/sTag:io 错误 javax.net.ssl.SSLHandshakeException:javax.net.ssl.SSLProtocolException:SSL 握手中止:ssl=0xb85c0110:SSL 库失败,通常是协议错误 错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败(外部/openssl/ssl/s23_clnt.c:744 0x918257f1:0x00000000) 在 org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:441) 在 libcore.net.http.httpconnection.setupSecureSocket(httpconnection.java:231) 在 libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.makeSslConnection(HttpsURLConnectionImpl.java:478) 在 libcore.net.http.HttpsURLConnectionImpl$HttpsEngine.connect(HttpsURLConnectionImpl.java:442) 在 libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290) 在 libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240) 在 libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:282) 在 libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177) 在 libcore.net.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:271) 在 java.net.URL.openStream(URL.java:462) 在 com.example.downloadalternative.DownloadActivity.DownloadFiles(DownloadActivity.java:69) 在 com.example.downloadalternative.DownloadActivity$1.run(DownloadActivity.java:43) 在 java.lang.Thread.run(Thread.java:841) 引起:javax.net.ssl.SSLProtocolException:SSL 握手中止:ssl=0xb85c0110:SSL 库失败,通常是协议错误 错误:14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报握手失败(外部/openssl/ssl/s23_clnt.c:744 0x918257f1:0x00000000) 在 org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(本机方法) 在 org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:399) ……还有 12 个 04-23 16:02:33.322 1982-2019/com.example.downloadalternative V/sTag:结果是2

我猜这与对 SSL/TLS 版本的支持有关,但在互联网安全方面,我是一个完整的新手。我发现了这个问题: how-to-fix-expected-android-api-level-21-but-was-19-in-android 但没有一个建议起作用(可能是因为我没有正确理解它们!)

谁能告诉我如何使 HTTPS 下载适用于 API18/19(并且仍然适用于所有更新的 API 级别)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)