如何修复预期 Android API 级别 21+ 但在 Android 中为 19
How to fix Expected Android API level 21+ but was 19 in Android
在我的应用程序中,我想从服务器获取数据,为了连接到服务器,我使用了 Retrofit、OkHttp.
但是当运行申请时,显示强制关闭错误。
In android api 21+ 不是错误,但在 api 21 下面显示强制关闭错误.
ApiClient class代码:
class ApiClient constructor(private val deviceUUID: String) {
private val apiServices: ApiServices
init {
//Gson
val gson = GsonBuilder()
.setLenient()
.create()
//Http log
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.level =
if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
//Http Builder
val clientBuilder = OkHttpClient.Builder()
clientBuilder.interceptors().add(loggingInterceptor)
clientBuilder.addInterceptor { chain ->
val request = chain.request()
request.newBuilder().addHeader(AGENT_NAME, AGENT_VALUE).build()
chain.proceed(request)
}
clientBuilder.addInterceptor { chain ->
val request = chain.request()
request.newBuilder().addHeader(X_CLIENT_VERSION, APP_VERSION_NAME).build()
chain.proceed(request)
}
clientBuilder.addInterceptor { chain ->
val request = chain.request()
request.newBuilder().addHeader(UUID_NAME, deviceUUID).build()
chain.proceed(request)
}
//Http client
val client = clientBuilder
.readTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
.writeTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
.connectTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build()
//Retrofit
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.build()
//Init apiServices
apiServices = retrofit.create(ApiServices::class.java)
}
companion object {
private var apiClient: ApiClient? = null
fun getInstance(deviceUUID: String): ApiClient =
apiClient ?: synchronized(this) {
apiClient ?: ApiClient(deviceUUID).also {
apiClient = it
}
}
}
/**
* Send apiServices to ApisUseCase for initialize all of apis
*/
fun apisUseCase(): ApisUseCase {
return ApisUseCase(apiServices)
}
}
显示此行的错误:.build()
在此方法上 val client = clientBuilder
我将这段代码添加到 gradle.build
compileOptions {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
但再次显示错误!
错误信息:
java.lang.ExceptionInInitializerError
at okhttp3.OkHttpClient.newSslSocketFactory(OkHttpClient.java:263)
at okhttp3.OkHttpClient.<init>(OkHttpClient.java:229)
at okhttp3.OkHttpClient$Builder.build(OkHttpClient.java:1015)
at com.app.android.data.services.ApiClient.<init>(ApiClient.kt:56)
at com.app.android.ui.splash.SplashPresenterImpl.checkUpdate(SplashPresenterImpl.kt:18)
at com.app.android.ui.splash.SplashActivity.onCreate(SplashActivity.kt:40)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2243)
at android.app.ActivityThread.access0(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5019)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Expected Android API level 21+ but was 19
at okhttp3.internal.platform.AndroidPlatform.buildIfSupported(AndroidPlatform.java:238)
at okhttp3.internal.platform.Platform.findPlatform(Platform.java:202)
at okhttp3.internal.platform.Platform.<clinit>(Platform.java:79)
Gradle.Build 代码:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'androidx.navigation.safeargs'
apply plugin: 'kotlin-kapt'
apply plugin: 'io.fabric'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.app.android"
minSdkVersion 16
targetSdkVersion 28
versionCode 100
versionName "2.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
}
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0-beta01'
implementation 'androidx.core:core-ktx:1.2.0-alpha02'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.viewpager:viewpager:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.core:core:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
//JWT decoder
implementation 'com.auth0.android:jwtdecode:1.2.0'
//Anko lib
implementation "org.jetbrains.anko:anko-commons:0.10.8"
implementation "org.jetbrains.anko:anko-design:0.10.8"
//Rx
implementation "io.reactivex.rxjava2:rxandroid:2.1.1"
implementation "io.reactivex.rxjava2:rxjava:2.2.8"
//OkHttp
implementation 'com.squareup.okhttp3:okhttp:3.14.1'
implementation "com.squareup.okhttp3:logging-interceptor:3.14.0"
//Retrofit
implementation "com.squareup.retrofit2:retrofit:2.5.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.5.0"
implementation "com.squareup.retrofit2:converter-gson:2.5.0"
//Gson
implementation 'com.google.code.gson:gson:2.8.5'
//Image
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
//Calligraphy
implementation 'io.github.inflationx:calligraphy3:3.1.0'
implementation 'io.github.inflationx:viewpump:1.0.0'
//Navigation
implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0-alpha05'
implementation 'androidx.navigation:navigation-ui-ktx:2.1.0-alpha05'
//Preferences lib
implementation 'com.github.MrNouri:GoodPrefs:1.0'
//Multiple sizes
implementation 'com.intuit.sdp:sdp-android:1.0.6'
// OnBoarding
implementation 'com.codemybrainsout.onboarding:onboarder:1.0.4'
//Alerter
implementation 'com.tapadoo.android:alerter:4.0.2'
//Fabric answer
implementation('com.crashlytics.sdk.android:answers:1.4.7@aar') { transitive = true }
//Fabric crash
implementation('com.crashlytics.sdk.android:crashlytics:2.9.9@aar') { transitive = true }
//Adjust
implementation 'com.adjust.sdk:adjust-android:4.17.0'
implementation 'com.android.installreferrer:installreferrer:1.0'
//Google and firebase services
implementation 'com.google.android.gms:play-services-analytics:16.0.8'
implementation 'com.google.firebase:firebase-core:16.0.9'
implementation 'com.google.firebase:firebase-messaging:17.6.0'
//Support MultiDex
implementation 'androidx.multidex:multidex:2.0.1'
//Room
implementation 'androidx.room:room-runtime:2.1.0'
annotationProcessor 'androidx.room:room-compiler:2.1.0'
//Android svg and noneOldAndroid
implementation 'com.caverock:androidsvg-aar:1.3'
implementation 'com.nineoldandroids:library:2.4.0'
//Animations
implementation 'com.daimajia.easing:library:2.0@aar'
implementation 'com.daimajia.androidanimations:library:2.3@aar'
}
apply plugin: 'com.google.gms.google-services'
我该如何解决?
对于低于21的minSDK,在gradle中将您的OkHttp版本更改为3.12.12,像这样-
//OkHttp
implementation ("com.squareup.okhttp3:okhttp:3.12.12"){
force = true //API 19 support
}
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.12'
应该没问题!
OKHTTP 刚刚放弃了对 Android 4
的支持
https://github.com/square/okhttp/issues/4481
您的应用必须使用旧版本或单独的分支。
查看来自 Jessie Wilson 的这篇 Medium post 了解更多信息:
https://medium.com/square-corner-blog/okhttp-3-13-requires-android-5-818bb78d07ce
当我在 build.gradle 文件中添加以下内容时,我在 API 级别 19 中遇到了同样的问题。
implementation 'com.squareup.okhttp3:okhttp:3.12.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.13.1'
最后,下面的代码帮助我解决了这个问题:
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'
希望这个解决方案适用于所有人。
Android 4.4(适合我)
def ok_http_version = "3.11.0"
implementation "com.squareup.okhttp3:okhttp:$ok_http_version"
implementation "com.squareup.okhttp3:logging-interceptor:$ok_http_version"
对于仍然需要旧版本 Android 库的每个人,您需要使用 OkHttp 3.12.x 分支。该分支的最新版本是 3.12.6。我已经测试并确认该版本适用于三星平板电脑 SM-T116NU (Android 19)。
以下是 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, 2020.
api 级别低于 21
使用版本 3.11.0
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
感谢@https://whosebug.com/users/5773044/anupam
此代码适用于 Android API 19:
// Note: 3.12.+ to support Android API 19
implementation 'com.squareup.okhttp3:okhttp:3.12.10'
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.10'
implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.4'
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'
implementation 'com.squareup.retrofit2:converter-scalars:2.6.4'
testImplementation 'com.squareup.retrofit2:retrofit-mock:2.6.4'
androidTestImplementation 'com.squareup.retrofit2:retrofit-mock:2.6.4'
我在这里解决了将此依赖项降级到此版本的问题
api 'com.squareup.retrofit2:retrofit:2.3.0'
api 'com.squareup.retrofit2:converter-gson:2.3.0'
api 'com.squareup.okhttp3:okhttp:3.8.0'
并将此代码添加到 MainActivity 的 onCreate
try {
ProviderInstaller.installIfNeeded(this);
} catch (GooglePlayServicesRepairableException e) {
// Indicates that Google Play services is out of date, disabled, etc.
// Prompt the user to install/update/enable Google Play services.
GoogleApiAvailability.getInstance()
.showErrorNotification(this, e.getConnectionStatusCode());
} catch (GooglePlayServicesNotAvailableException e) {
// Indicates a non-recoverable error; the ProviderInstaller is not able
// to install an up-to-date Provider.
}
需要降级依赖项,因为最新版本需要 android API 21 或更高版本。
上面的代码是为了 android 更新您的安全提供程序以防止 SSL 攻击。请参阅 https://developer.android.com/training/articles/security-gms-provider.html 了解更多信息。
@Anupam 回答的注意事项 - 如果您使用 Android Studio 4.0+
,则不推荐使用强制
https://docs.gradle.org/current/userguide/upgrading_version_5.html
Forced dependencies
Forcing dependency versions using force = true on a first-level dependency has been deprecated.
Force has both a semantic and ordering issue which can be avoided by using a strict version constraint.
前面的方法是使用关键字 "strictly" 进行依赖降级。
参考https://docs.gradle.org/current/userguide/dependency_downgrade_and_exclude.html#sec:enforcing_dependency_version
所以你应该得到类似下面的东西...
implementation ('com.squareup.okhttp3:okhttp'){
version {
strictly '3.12.12'
}
}
根据 Okhttp documentation,他们放弃了对 Android 4.
的支持
解决方案是使用 3.12.x 版本的 Okhttp:
def okhttp_version="3.12.0"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
implementation("com.squareup.okhttp3:okhttp") {
version { strictly "$okhttp_version" }
}
您还可以在 Square blog 中了解此更改的原因:
Why Android 5+ and Why Now?
TLS is the mechanism that makes HTTPS calls secure, private, and
authenticated. OkHttp is aware of five versions: SSLv3 (1996), TLSv1
(1999), TLSv1.1 (2006), TLSv1.2 (2008), and TLSv1.3 (2018). We dropped
support for SSLv3 in 2014 in response to the POODLE attack.
Now it’s time to drop both TLSv1 and TLSv1.1 and to make TLSv1.2 the
Internet’s new minimum standard. On October 15 our colleagues at
Google, Mozilla, Microsoft, and Apple announced that their browsers
will require TLSv1.2 or better starting in early 2020.
Google added support for TLSv1.2 in Android 5.0. Oracle added it in
Java 8. In OkHttp 3.13 we require that the host platform has built-in
support for TLSv1.2.
What about Android 4.x?
Google’s distribution dashboard shows that ~11% of the devices that
visited the Play Store in October 2018 were running Android 4.x. We’ve
created a branch, OkHttp 3.12.x, to support these devices. Should we
encounter any severe bugs or security problems we’ll backport the
fixes and release. We plan to maintain this branch through December
31, 2020.
If you really need TLSv1.2 on Android 4.x, that’s possible! Ankush
Gupta has written a thorough guide that explains how to get Google
Play Services to do it. Even if you follow this process you should
still use OkHttp 3.12.x with Android 4.x devices.
Android 4.x?
Google 的分布仪表板显示,2018 年 10 月访问 Play 商店的设备中约有 11% 是 运行 Android 4.x。我们创建了一个分支 OkHttp 3.12.x 来支持这些设备。如果我们遇到任何严重的错误或安全问题,我们将向后移植修复程序并发布。我们计划将该分支维护到 2020 年 12 月 31 日。
如果您真的需要 Android 4.x 上的 TLSv1.2,那是可能的! Ankush Gupta 编写了详尽的指南,解释了如何获取 Google Play 服务来执行此操作。即使您遵循此过程,您仍然应该在 Android 4.x 设备上使用 OkHttp 3.12.x。
所以您可以使用下面的代码来解决您的问题
implementation ("com.squareup.okhttp3:okhttp:3.12.12"){
force = true //API 19 support
}
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.12'
在我的应用程序中,我想从服务器获取数据,为了连接到服务器,我使用了 Retrofit、OkHttp.
但是当运行申请时,显示强制关闭错误。
In android api 21+ 不是错误,但在 api 21 下面显示强制关闭错误.
ApiClient class代码:
class ApiClient constructor(private val deviceUUID: String) {
private val apiServices: ApiServices
init {
//Gson
val gson = GsonBuilder()
.setLenient()
.create()
//Http log
val loggingInterceptor = HttpLoggingInterceptor()
loggingInterceptor.level =
if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE
//Http Builder
val clientBuilder = OkHttpClient.Builder()
clientBuilder.interceptors().add(loggingInterceptor)
clientBuilder.addInterceptor { chain ->
val request = chain.request()
request.newBuilder().addHeader(AGENT_NAME, AGENT_VALUE).build()
chain.proceed(request)
}
clientBuilder.addInterceptor { chain ->
val request = chain.request()
request.newBuilder().addHeader(X_CLIENT_VERSION, APP_VERSION_NAME).build()
chain.proceed(request)
}
clientBuilder.addInterceptor { chain ->
val request = chain.request()
request.newBuilder().addHeader(UUID_NAME, deviceUUID).build()
chain.proceed(request)
}
//Http client
val client = clientBuilder
.readTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
.writeTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
.connectTimeout(NETWORK_CONNECTIONS_TIME, TimeUnit.SECONDS)
.retryOnConnectionFailure(true)
.build()
//Retrofit
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create(gson))
.addCallAdapterFactory(RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()))
.build()
//Init apiServices
apiServices = retrofit.create(ApiServices::class.java)
}
companion object {
private var apiClient: ApiClient? = null
fun getInstance(deviceUUID: String): ApiClient =
apiClient ?: synchronized(this) {
apiClient ?: ApiClient(deviceUUID).also {
apiClient = it
}
}
}
/**
* Send apiServices to ApisUseCase for initialize all of apis
*/
fun apisUseCase(): ApisUseCase {
return ApisUseCase(apiServices)
}
}
显示此行的错误:.build()
在此方法上 val client = clientBuilder
我将这段代码添加到 gradle.build
compileOptions {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
但再次显示错误!
错误信息:
java.lang.ExceptionInInitializerError
at okhttp3.OkHttpClient.newSslSocketFactory(OkHttpClient.java:263)
at okhttp3.OkHttpClient.<init>(OkHttpClient.java:229)
at okhttp3.OkHttpClient$Builder.build(OkHttpClient.java:1015)
at com.app.android.data.services.ApiClient.<init>(ApiClient.kt:56)
at com.app.android.ui.splash.SplashPresenterImpl.checkUpdate(SplashPresenterImpl.kt:18)
at com.app.android.ui.splash.SplashActivity.onCreate(SplashActivity.kt:40)
at android.app.Activity.performCreate(Activity.java:5231)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2157)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2243)
at android.app.ActivityThread.access0(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5019)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: Expected Android API level 21+ but was 19
at okhttp3.internal.platform.AndroidPlatform.buildIfSupported(AndroidPlatform.java:238)
at okhttp3.internal.platform.Platform.findPlatform(Platform.java:202)
at okhttp3.internal.platform.Platform.<clinit>(Platform.java:79)
Gradle.Build 代码:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'androidx.navigation.safeargs'
apply plugin: 'kotlin-kapt'
apply plugin: 'io.fabric'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.app.android"
minSdkVersion 16
targetSdkVersion 28
versionCode 100
versionName "2.5.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
}
repositories {
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0-beta01'
implementation 'androidx.core:core-ktx:1.2.0-alpha02'
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.viewpager:viewpager:1.0.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.core:core:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
//JWT decoder
implementation 'com.auth0.android:jwtdecode:1.2.0'
//Anko lib
implementation "org.jetbrains.anko:anko-commons:0.10.8"
implementation "org.jetbrains.anko:anko-design:0.10.8"
//Rx
implementation "io.reactivex.rxjava2:rxandroid:2.1.1"
implementation "io.reactivex.rxjava2:rxjava:2.2.8"
//OkHttp
implementation 'com.squareup.okhttp3:okhttp:3.14.1'
implementation "com.squareup.okhttp3:logging-interceptor:3.14.0"
//Retrofit
implementation "com.squareup.retrofit2:retrofit:2.5.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.5.0"
implementation "com.squareup.retrofit2:converter-gson:2.5.0"
//Gson
implementation 'com.google.code.gson:gson:2.8.5'
//Image
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
//Calligraphy
implementation 'io.github.inflationx:calligraphy3:3.1.0'
implementation 'io.github.inflationx:viewpump:1.0.0'
//Navigation
implementation 'androidx.navigation:navigation-fragment-ktx:2.1.0-alpha05'
implementation 'androidx.navigation:navigation-ui-ktx:2.1.0-alpha05'
//Preferences lib
implementation 'com.github.MrNouri:GoodPrefs:1.0'
//Multiple sizes
implementation 'com.intuit.sdp:sdp-android:1.0.6'
// OnBoarding
implementation 'com.codemybrainsout.onboarding:onboarder:1.0.4'
//Alerter
implementation 'com.tapadoo.android:alerter:4.0.2'
//Fabric answer
implementation('com.crashlytics.sdk.android:answers:1.4.7@aar') { transitive = true }
//Fabric crash
implementation('com.crashlytics.sdk.android:crashlytics:2.9.9@aar') { transitive = true }
//Adjust
implementation 'com.adjust.sdk:adjust-android:4.17.0'
implementation 'com.android.installreferrer:installreferrer:1.0'
//Google and firebase services
implementation 'com.google.android.gms:play-services-analytics:16.0.8'
implementation 'com.google.firebase:firebase-core:16.0.9'
implementation 'com.google.firebase:firebase-messaging:17.6.0'
//Support MultiDex
implementation 'androidx.multidex:multidex:2.0.1'
//Room
implementation 'androidx.room:room-runtime:2.1.0'
annotationProcessor 'androidx.room:room-compiler:2.1.0'
//Android svg and noneOldAndroid
implementation 'com.caverock:androidsvg-aar:1.3'
implementation 'com.nineoldandroids:library:2.4.0'
//Animations
implementation 'com.daimajia.easing:library:2.0@aar'
implementation 'com.daimajia.androidanimations:library:2.3@aar'
}
apply plugin: 'com.google.gms.google-services'
我该如何解决?
对于低于21的minSDK,在gradle中将您的OkHttp版本更改为3.12.12,像这样-
//OkHttp
implementation ("com.squareup.okhttp3:okhttp:3.12.12"){
force = true //API 19 support
}
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.12'
应该没问题!
OKHTTP 刚刚放弃了对 Android 4
的支持https://github.com/square/okhttp/issues/4481
您的应用必须使用旧版本或单独的分支。
查看来自 Jessie Wilson 的这篇 Medium post 了解更多信息: https://medium.com/square-corner-blog/okhttp-3-13-requires-android-5-818bb78d07ce
当我在 build.gradle 文件中添加以下内容时,我在 API 级别 19 中遇到了同样的问题。
implementation 'com.squareup.okhttp3:okhttp:3.12.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.13.1'
最后,下面的代码帮助我解决了这个问题:
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.5.0'
希望这个解决方案适用于所有人。
Android 4.4(适合我)
def ok_http_version = "3.11.0"
implementation "com.squareup.okhttp3:okhttp:$ok_http_version"
implementation "com.squareup.okhttp3:logging-interceptor:$ok_http_version"
对于仍然需要旧版本 Android 库的每个人,您需要使用 OkHttp 3.12.x 分支。该分支的最新版本是 3.12.6。我已经测试并确认该版本适用于三星平板电脑 SM-T116NU (Android 19)。
以下是 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, 2020.
api 级别低于 21
使用版本 3.11.0 implementation 'com.squareup.okhttp3:okhttp:3.11.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
感谢@https://whosebug.com/users/5773044/anupam 此代码适用于 Android API 19:
// Note: 3.12.+ to support Android API 19
implementation 'com.squareup.okhttp3:okhttp:3.12.10'
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.10'
implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.4'
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'
implementation 'com.squareup.retrofit2:converter-scalars:2.6.4'
testImplementation 'com.squareup.retrofit2:retrofit-mock:2.6.4'
androidTestImplementation 'com.squareup.retrofit2:retrofit-mock:2.6.4'
我在这里解决了将此依赖项降级到此版本的问题
api 'com.squareup.retrofit2:retrofit:2.3.0'
api 'com.squareup.retrofit2:converter-gson:2.3.0'
api 'com.squareup.okhttp3:okhttp:3.8.0'
并将此代码添加到 MainActivity 的 onCreate
try {
ProviderInstaller.installIfNeeded(this);
} catch (GooglePlayServicesRepairableException e) {
// Indicates that Google Play services is out of date, disabled, etc.
// Prompt the user to install/update/enable Google Play services.
GoogleApiAvailability.getInstance()
.showErrorNotification(this, e.getConnectionStatusCode());
} catch (GooglePlayServicesNotAvailableException e) {
// Indicates a non-recoverable error; the ProviderInstaller is not able
// to install an up-to-date Provider.
}
需要降级依赖项,因为最新版本需要 android API 21 或更高版本。
上面的代码是为了 android 更新您的安全提供程序以防止 SSL 攻击。请参阅 https://developer.android.com/training/articles/security-gms-provider.html 了解更多信息。
@Anupam 回答的注意事项 - 如果您使用 Android Studio 4.0+
,则不推荐使用强制https://docs.gradle.org/current/userguide/upgrading_version_5.html
Forced dependencies Forcing dependency versions using force = true on a first-level dependency has been deprecated.
Force has both a semantic and ordering issue which can be avoided by using a strict version constraint.
前面的方法是使用关键字 "strictly" 进行依赖降级。 参考https://docs.gradle.org/current/userguide/dependency_downgrade_and_exclude.html#sec:enforcing_dependency_version
所以你应该得到类似下面的东西...
implementation ('com.squareup.okhttp3:okhttp'){
version {
strictly '3.12.12'
}
}
根据 Okhttp documentation,他们放弃了对 Android 4.
的支持解决方案是使用 3.12.x 版本的 Okhttp:
def okhttp_version="3.12.0"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
implementation("com.squareup.okhttp3:okhttp") {
version { strictly "$okhttp_version" }
}
您还可以在 Square blog 中了解此更改的原因:
Why Android 5+ and Why Now?
TLS is the mechanism that makes HTTPS calls secure, private, and authenticated. OkHttp is aware of five versions: SSLv3 (1996), TLSv1 (1999), TLSv1.1 (2006), TLSv1.2 (2008), and TLSv1.3 (2018). We dropped support for SSLv3 in 2014 in response to the POODLE attack.
Now it’s time to drop both TLSv1 and TLSv1.1 and to make TLSv1.2 the Internet’s new minimum standard. On October 15 our colleagues at Google, Mozilla, Microsoft, and Apple announced that their browsers will require TLSv1.2 or better starting in early 2020.
Google added support for TLSv1.2 in Android 5.0. Oracle added it in Java 8. In OkHttp 3.13 we require that the host platform has built-in support for TLSv1.2.
What about Android 4.x?
Google’s distribution dashboard shows that ~11% of the devices that visited the Play Store in October 2018 were running Android 4.x. We’ve created a branch, OkHttp 3.12.x, to support these devices. Should we encounter any severe bugs or security problems we’ll backport the fixes and release. We plan to maintain this branch through December 31, 2020.
If you really need TLSv1.2 on Android 4.x, that’s possible! Ankush Gupta has written a thorough guide that explains how to get Google Play Services to do it. Even if you follow this process you should still use OkHttp 3.12.x with Android 4.x devices.
Android 4.x?
Google 的分布仪表板显示,2018 年 10 月访问 Play 商店的设备中约有 11% 是 运行 Android 4.x。我们创建了一个分支 OkHttp 3.12.x 来支持这些设备。如果我们遇到任何严重的错误或安全问题,我们将向后移植修复程序并发布。我们计划将该分支维护到 2020 年 12 月 31 日。
如果您真的需要 Android 4.x 上的 TLSv1.2,那是可能的! Ankush Gupta 编写了详尽的指南,解释了如何获取 Google Play 服务来执行此操作。即使您遵循此过程,您仍然应该在 Android 4.x 设备上使用 OkHttp 3.12.x。
所以您可以使用下面的代码来解决您的问题
implementation ("com.squareup.okhttp3:okhttp:3.12.12"){
force = true //API 19 support
}
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.12'