在小于 API 21 的 api 级别上使用 OkHttp

Using OkHttp on api level less than API 21

我一直在寻找用于我的应用程序的最佳网络客户端,然后我登陆了 OkHttp 或改造,但它们都需要 API 级别 21+,我的应用程序当前的 minSdkVersion 是 17,所以我应该将我的 minSdkVersion 增加到 API 21 或者我应该使用 OkHttp 3.12.x 分支,如果您有任何其他解决方案,我想听听您的想法。

请注意,在 OkHttp 网站上他们说:

"The OkHttp 3.12.x branch supports Android 2.3+ (API level 9+) and Java 7+. These platforms lack support for TLS 1.2 and should not be used. But because upgrading is difficult we will backport critical fixes to the 3.12.x branch through December 31, 2021."

建议增加minSdkVersion,因为retrofit依赖特殊的库

虽然如果你不想增加api,你可以使用asyntask来调用服务

示例

package principal.example;

import android.os.AsyncTask;
import android.util.Log;

import java.io.IOException;
import java.net.URL;
import java.net.HttpURLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Post extends AsyncTask<String, Void, String> {

    private InputStreamReader inputStreamReader;
    private BufferedReader bufferedReader;

    @Override
    protected String doInBackground(String... params){

        try {
            URL obj = new URL(params[0]);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("User-Agent", " ");
            con.connect();
            inputStreamReader=new InputStreamReader(con.getInputStream());
            bufferedReader = new BufferedReader(inputStreamReader);
            return bufferedReader.readLine();
        }catch(Exception e){
            Log.d("Url  doInBackground", e.toString());
            return null;
        } finally {
            try {
                closeConnection();
            } catch(Exception e){

            }
        }

    }

    private void closeConnection() {
        try {
            if(bufferedReader!=null){
                bufferedReader.close();
            }

            if(inputStreamReader!=null){
                inputStreamReader.close();
            }
        }catch(IOException ex){
            Log.d("Url disconnect", ex.toString());
        }
    }

    @Override
    protected void onPostExecute(String result){

        super.onPostExecute(result);
    }
}

如果您决定支持 21 岁以上的客户,您应该做几件事

  1. 回到 OkHttp 3.12.12,它将继续获得安全修复。
  2. 尽可能帮助保护这些旧客户端,因为它们本身都不安全,并且由于保留对旧密码等的支持而降低服务器的安全性。

在您的构建文件中

  implementation 'org.conscrypt:conscrypt-android:2.4.0'

并在您请求之前激活 Conscrypt

import org.conscrypt.Conscrypt


Security.insertProviderAt(Conscrypt.newProvider(), 1)
val client = OkHttpClient.Builder().build()

val request = Request.Builder().url("https://status.datadoghq.com/").build()
client.newCall(request).execute().use { response ->
  println(response.code())
}

这应该允许您的旧客户端支持 TLSv1.2。

您可能还需要降级 Retrofit,但我不确定那里的正确建议是什么。也许到 2.6.4?

https://github.com/square/retrofit/blob/master/CHANGELOG.md