如何修复在Android中出现的"Call requires API level 26 (current min is 25)"错误

40

我知道这个问题可能是重复的,但我没有找到任何关于我的问题的答案。在我的 Android 应用中使用了 LocalDateTime,需要 API 26,而我的设备 API 是 25。

我该怎么办?非常感谢您的帮助。


很明显,在旧设备上无法使用新功能。你必须自己实现这个功能,或者找到一个提供类似功能的库。 - Vladyslav Matviienko
多年过去了,但我只是想指出@VladyslavMatviienko的评论已经不再有效。 - joakie
6个回答

52

在较低版本的Android系统上使用LocalDateTime的最佳方法是通过解糖(必须使用Android Gradle插件4.0或更高版本)。只需将以下行添加到您的app模块gradle文件中:

输入图像描述

最后,在依赖块中添加以下依赖项:

coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.10'


3
这是谷歌推荐的方法。参考链接:https://developer.android.com/studio/write/java8-support#library-desugaring - Thanh Nguyen
此外,根据Android官方网站的说明:“使用Android Gradle插件7.4.0或更高版本,还可以通过desugared库2.0.0或更高版本获得一些Java 11语言API。”这些库有三种不同的类型:minimal(最小化)、default(默认)和nio(这是一个综合性的类型,因为它还包含了其他两种类型的包)。 - joakie

42
你需要使用https://github.com/JakeWharton/ThreeTenABP来在Android API < 26中使用LocalDateTime。
将依赖项添加到您的项目中(请按照项目README进行操作)。
implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'

然后将您的LocalDateTime导入更改为:
import java.time.LocalDateTime;

给:
import org.threeten.bp.LocalDateTime;

请不要忘记在您的Application类的onCreate方法中调用AndroidThreeTen.init(this)。
class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        AndroidThreeTen.init(this);
    }

}

更新:

上述提到的库不再是最佳选择,正如JakeWharton/ThreeTenABP README中所提到的:

注意:该库的开发正在逐渐停止。请考虑在未来几个月内切换到Android Gradle插件4.0、java.time.*以及其核心库的desugaring功能。

要在旧的API级别中使用LocalDateTime,请使用Gradle插件4.0的desugaring功能: https://developer.android.com/studio/write/java8-support#library-desugaring


1
现在在ThreeTenABP存储库中建议您使用代码去糖化(https://developer.android.com/studio/write/java8-support#library-desugaring) - Hiro

12

在较低版本的Android上使用LocalDateTime需要进行解糖操作(您必须使用Android Gradle插件版本4.0或更高版本),启用Java8并在您的app.gradle中使用以下代码:

android {
    defaultConfig {
        // Required when setting minSdkVersion to 20 or lower
        multiDexEnabled = true
    }

    compileOptions {
        // Flag to enable support for the new language APIs
        coreLibraryDesugaringEnabled = true // <- this flag is required

        // Sets Java compatibility to Java 8
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    // For Kotlin projects
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

dependencies {
    coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5") // <- this dependency is required
}

支持文档


这个答案对我有用,因为只需添加依赖项 coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5"),我就必须在使用需要API26的代码的函数上方放置 @RequiresApi(Build.VERSION_CODES.O)。一旦我将 coreLibraryDesugaringEnabled = true 添加到 compileOptions 中,我就不再需要这样做了。 - Lance Samaria

4
你可以使用ThreeTenBP。但是对于android,建议使用Jake Wharton的ThreeTenABP为什么不使用ThreeTenBP?

与在Android上使用Joda-Time的问题类似,threetenbp使用JAR资源来加载时区信息。这是Android上一种极其低效的机制。

此库将时区信息放置为标准的Android asset,并提供了一个自定义加载器,以便有效地解析它。

为什么不使用Joda-Time?

Joda-Time具有非常大的API,带来了非常大的二进制大小和方法计数。 JSR-310和Joda-Time的创作者也表示,尽管Joda-Time没有破坏,但它确实存在设计缺陷。

如果您已经在使用Joda-Time,则除非其大小或方法计数与您相关,否则很少理由进行更改。但是对于新项目,此库以Java 8的标准API作为更小的包,不仅二进制大小和方法计数小,而且API大小也小得多。

这些解释来自Jake Wharton的ThreeTenABP。

我刚刚按照你给我的链接,但错误一直存在 :( - Anna

1
如果你按照上面提到的设置了 coreLibraryDesugaringEnabled = true,但仍然看到问题没有解决,请检查你是否安装了最新版本的 coreLibraryDesugaring,就像我的情况一样,我升级到 1.1.5 后问题得到了解决。请注意保留 HTML 标签。

0
不要忘记点击“与Gradle文件同步项目”以使配置生效。
这将解决剩余的警告信息。

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Vojin Purić

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接