Android 下载https文件
时间: 2023-12-05 12:06:32 浏览: 55
在 Android 中下载 HTTPS 文件与下载 HTTP 文件类似,但需要注意以下几个方面:
1. 需要使用 HTTPS 协议的 URL,例如 `https://example.com/file.pdf`。
2. 需要添加对 HTTPS 的支持,可以通过在应用程序的 `build.gradle` 文件中添加以下依赖项来实现:
```groovy
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
```
3. 由于 HTTPS 证书验证是默认开启的,因此如果目标服务器的证书不受信任,则会导致下载失败。为了避免这种情况,可以在下载前添加一个自定义的证书验证器,例如:
```java
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(createSSLSocketFactory(), new TrustAllCerts())
.hostnameVerifier(new TrustAllHostnameVerifier())
.build();
private SSLSocketFactory createSSLSocketFactory() {
try {
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
return sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
return null;
}
}
private static class TrustAllCerts implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
}
private static class TrustAllHostnameVerifier implements HostnameVerifier {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}
```
这里我们定义了一个自定义的证书验证器 `TrustAllCerts`,它接受所有的证书,以及一个自定义的主机名验证器 `TrustAllHostnameVerifier`,它接受所有的主机名。需要注意的是,这种方式是不安全的,因为它接受所有的证书和主机名,可能会导致中间人攻击。
有了以上知识,我们就可以使用 OkHttp 来下载 HTTPS 文件。以下是一个简单的示例代码:
```java
String fileUrl = "https://example.com/file.pdf";
Request request = new Request.Builder()
.url(fileUrl)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "Download failed: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
try (InputStream inputStream = response.body().byteStream();
OutputStream outputStream = new FileOutputStream(Environment.getExternalStorageDirectory() + "/file.pdf")) {
byte[] buffer = new byte[4096];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
Log.d(TAG, "Download completed!");
} catch (IOException e) {
e.printStackTrace();
}
} else {
Log.e(TAG, "Download failed: " + response.message());
}
}
});
```
在这个示例中,我们首先创建了一个 OkHttpClient 对象,然后使用 OkHttp 来下载 HTTPS 文件。在响应成功时,我们从响应体中获取文件数据,并将其写入存储设备中的文件。在响应失败时,我们打印一条日志消息。