Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复预期的Android API级别21+;但在安卓系统中只有19岁_Android_Kotlin_Retrofit2_Okhttp3 - Fatal编程技术网

如何修复预期的Android API级别21+;但在安卓系统中只有19岁

如何修复预期的Android API级别21+;但在安卓系统中只有19岁,android,kotlin,retrofit2,okhttp3,Android,Kotlin,Retrofit2,Okhttp3,在我的应用程序中,我希望从服务器获取数据,以便连接到我使用的服务器改装,OkHttp 但在运行应用程序时,向我显示强制关闭错误。 在android中,api 21+不是错误,而是在api 21下方显示强制关闭错误。 ApiClient类代码: class ApiClient constructor(private val deviceUUID: String) { private val apiServices: ApiServices init { //Gs

在我的应用程序中,我希望从服务器获取数据,以便连接到我使用的服务器改装OkHttp
但在运行应用程序时,向我显示强制关闭错误。
在android中,api 21+
不是错误,而是在api 21下方显示强制关闭错误。

ApiClient类代码:

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)
    }
}
    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'
显示此行的错误:
.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.access$800(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)
但再一次告诉我错误

错误消息:

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.access$800(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)

如何修复它?

对于低于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的支持

您必须为您的应用程序使用旧版本或sperate分支

更多信息,请参阅杰西·威尔逊的这篇中篇文章:

当我在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(适合我)


对于仍然需要旧版本Android库的所有人,您需要使用OkHttp 3.12.x分支。该分支的最新版本是。我已经测试并确认该版本在三星平板电脑SM-T116NU(安卓19)上运行

以下是OkHttp的摘录:

OkHttp 3.12.x分支支持Android 2.3+(API级别9+)和Java 7+。这些平台缺乏对TLS 1.2的支持,因此不应使用。但由于升级很困难,我们将在2020年12月31日之前将关键补丁备份到3.12.x分支


api级别低于21时,请使用版本3.11.0

 implementation 'com.squareup.okhttp3:okhttp:3.11.0'
 implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
谢谢@ 此代码适用于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.
    }
降级依赖项是neet,因为最新版本需要android API 21或更高版本


上面的代码用于android更新您的安全提供商,以防止SSL攻击。请参阅以了解更多信息。

注意@Anupam answer-如果您使用的是Android Studio 4.0,则不推荐使用force+

强制依赖 不推荐在一级依赖项上使用force=true强制依赖项版本

Force既有语义问题,也有顺序问题,可以通过使用严格的

前进的道路是使用关键字“严格”进行依赖关系降级。 指

所以你应该做如下的事情

  implementation ('com.squareup.okhttp3:okhttp'){ 
            version {
                strictly '3.12.12'
            }
    }
据报道,他们放弃了对安卓4的支持

解决方案是使用Okhttp的3.12.x版本:

def okhttp_version="3.12.0"
implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"
implementation("com.squareup.okhttp3:okhttp") {
    version { strictly "$okhttp_version" }
}
您还可以通过以下内容了解此更改的原因:

为什么是安卓5+,为什么是现在

TLS是使HTTPS调用安全、私有和安全的机制 认证的。OkHttp知道五个版本:SSLv3(1996),TLSv1 (1999)、TLSv1.1(2006)、TLSv1.2(2008)和TLSv1.3(2018)。我们放弃了 2014年针对贵宾犬袭击对SSLv3的支持

现在是时候放弃TLSv1和TLSv1.1,并使TLSv1.2成为 互联网的新最低标准。10月15日,我们的同事在 谷歌、Mozilla、微软和苹果宣布他们的浏览器 将要求在2020年初启动TLSv1.2或更高版本

谷歌在安卓5.0中增加了对TLSv1.2的支持。甲骨文在 爪哇8。在OkHttp 3.13中,我们要求主机平台具有内置的 对TLSv1.2的支持

安卓4.x呢

谷歌的分发仪表板显示,大约11%的设备 2018年10月访问了Play商店,当时他们正在运行Android 4.x。我们已经 创建了一个分支okhttp3.12.x来支持这些设备。我们应该吗 如果遇到任何严重的错误或安全问题,我们将备份 修复和发布。我们计划将这家分行维持到12月 2020年12月31日

如果你真的需要Android 4.x上的TLSv1.2,那是可能的!安库什 古普塔写了一份详尽的指南,解释了如何获得谷歌 播放服务来完成它。即使你遵循这个过程,你也应该 仍然在Android 4.x设备上使用OkHttp 3.12.x

安卓4.x

谷歌的分发仪表盘显示,2018年10月访问Play商店的设备中约有11%运行Android 4.x。我们创建了一个分支okhttp3.12.x来支持这些设备。如果我们遇到任何严重的错误或安全问题,我们将备份修复并发布。我们计划将该分行维持至2020年12月31日

如果你真的需要Android 4.x上的TLSv1.2,那是可能的!安库什·古普塔(Ankush Gupta)编写了一份详尽的指南,解释了如何让谷歌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'

对不起,4.4。fail3.12.5是截至2019年9月的最新版本。你可以在这里找到最新的3.12.x版本:新的gradle语法:
implementation('com.squareup.okhttp3:okhttp'){version{version{严格地说是'3.12.12'}}
对于我来说,在更新操作系统11(像素4)后出现同样的错误,有人测试过android操作系统11吗?我会试试你们为我工作的地方。感谢链接,对决定充满信心。谢谢真的很欣赏这一点,因为okhttp通常与改型一起使用,所以了解哪种改型版本适用于哪种okhttp版本是件好事Square博客引用了一篇关于它的文章: