调用需要 API 级别 26(当前最低为 23):java.time.Instant#now

     2023-04-14     55

关键词:

【中文标题】调用需要 API 级别 26(当前最低为 23):java.time.Instant#now【英文标题】:Call requires API level 26 (current min is 23): java.time.Instant#now 【发布时间】:2019-08-28 06:36:21 【问题描述】:

我正在实施Google's Directions API。我的应用支持minSdkVersion 23,这里不支持java.time.Instant

是否有解决方案,或者我应该只检查用户的版本并在其版本受支持时允许此功能?

    DirectionsResult directionsResult = DirectionsApi.newRequest(geoApiContext)
            .mode(TravelMode.DRIVING)
            .origin(new com.google.maps.model.LatLng(mapFragment.getUserCoords().latitude, mapFragment.getUserCoords().longitude))
            .destination(tabHandlerCommunication.destinationBarCoords)
            .departureTime(Instant.now()) // <-- error here
            .await();

错误:

少... (Ctrl+F1) 检查信息:此检查扫描所有 应用程序中的 Android API 调用并警告任何调用 不适用于此应用程序所针对的所有版本 (根据清单中的最小 SDK 属性)。如果你 真的很想使用这个 API 并且不需要支持旧设备 只需在 build.gradle 或 AndroidManifest.xml 中设置 minSdkVersion 文件。如果您的代码故意访问较新的 API,并且您 已确保(例如通过条件执行)此代码将 只能在受支持的平台上调用,然后您可以注释 带有 @TargetApi 注释的类或方法指定 要应用的本地最小 SDK,例如 @TargetApi(11),这样 check 将 11 而不是清单文件的最小 SDK 视为 所需的 API 级别。如果你故意设置android: 样式定义中的属性,请确保将其放在 values-vNN 文件夹,以避免遇到运行时冲突 制造商添加了自定义属性的某些设备 id 与后来平台上的新 id 冲突。同样,您可以 在 XML 文件中使用 tools:targetApi="11" 来指示元素 只有在适当的情况下才会膨胀。问题 ID:NewApi

【问题讨论】:

Is there a solution for this 是的。更新minSdk 或使用java.time.Instant以外的其他东西 @MarcinOrlowski 更好的解决方案是将 ThreeTenABP 库添加到您的 Android 项目中,以获取大部分 java.time 的后向端口功能。请参阅Answer by Ole V.V.。 【参考方案1】:

如果您使用的是 Gradle 插件 4.0 或更高版本(Android Studio 4.0 或更高版本),则可以利用 D8 Core Library Desugaring。这包括java.time 中的部分功能,并允许您在项目中使用java.time.Instant;即使您需要支持 API 26 之前的版本。

在您模块的build.gradle 文件中:

android 

    compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
        coreLibraryDesugaringEnabled true
    

    // If using Kotlin
    kotlinOptions 
        jvmTarget = JavaVersion.VERSION_1_8
    

dependencies 
    …
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.5'

您现在应该可以无错误地使用此类。

一些来源:

Styling Android Jake Wharton Android Developers

【讨论】:

完美。它还允许使用其他有用的 API,例如流 不适用于 AS 4.2 Beta 6。构建失败,出现以下 Gradle 6.4.1 / AGP 4.0.2 异常:> No signature of method: build_dvug2jv3jezfh5oc48zh5hqe.android() is applicable for argument types: (build_dvug2jv3jezfh5oc48zh5hqe$_run_closure1) values: [build_dvug2jv3jezfh5oc48zh5hqe$_run_closure1@752d785a] 后续问题提交:github.com/StylingAndroid/Time/issues/1 该链接已损坏。 Java 8+ API 脱糖支持:developer.android.com/studio/write/java8-support【参考方案2】:

查看了developer guide,原来是Stringnow

以及常见的int UNIX 纪元时间戳,都是可接受的值:

departure_time — 指定所需的出发时间。您可以将时间指定为自世界标准时间 1970 年 1 月 1 日午夜开始的整数秒。或者,您可以指定一个值now,它将出发时间设置为当前时间(精确到最接近的秒数)。

在检查Java客户端的source code时,有一个方便的方法:

public DirectionsApiRequest departureTimeNow() 
    return param("departure_time", "now");

因此可以绕过java.time.Instant,以实现向后兼容性。


我已经提交了issue #559... 分叉库似乎是设置其他时间戳的唯一方法。

【讨论】:

【参考方案3】:

您可以在 Android API 级别 23 上使用 Instant 类和 java.time 中的其他类

java.time 在较旧和较新的 Android 设备上都能很好地工作。它只需要至少 Java 6

在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。 在非 Android 的 Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。 在(旧版)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

Oracle tutorial: Date Time 解释如何使用 java.time。 Java Specification Request (JSR) 310,其中首次描述了 java.time。 ThreeTen Backport project,java.time 的反向移植到 Java 6 和 7(JSR-310 的 ThreeTen)。 ThreeTenABP,Android 版 ThreeTen Backport Question: How to use ThreeTenABP in Android Project,解释得很透彻。

【讨论】:

【参考方案4】:

我在这里写了解决此问题的推荐方法:https://dev.to/cicerohellmann/what-is-desugaring-and-why-would-i-need-it-2bo0

但简单来说,你应该使用脱糖,它允许你在较低级别使用一些高级 API。值得检查。我还添加了所有链接以找到实现它的方法以及关于它的一些优点和缺点

【讨论】:

【参考方案5】:

没有其他方法可以做到这一点。您不能使用需要更高 SDK 版本和更低版本的 API。

您应该将应用级别 build.gradle 中的 minSdkVersion 属性从 23 文件更改为 26。

【讨论】:

这样的答案没有考虑到 OP 的约束。更改受支持的minSdkVersion 在技术上“很简单”,但有许多非技术原因可能不那么容易做到。

调用需要 API 级别 23(当前最低为 14):android.app.Activity#requestPermissions,checkSelfPermission [重复]

】调用需要API级别23(当前最低为14):android.app.Activity#requestPermissions,checkSelfPermission[重复]【英文标题】:CallrequiresAPIlevel23(currentminis14):android.app.Activity#requestPermissions,checkSelfPermission[duplicate]【发布时间】:2016-06-1617 查看详情

调用需要 API 级别 24(当前最低为 8):新的 android.location.GnssStatus.Callback

】调用需要API级别24(当前最低为8):新的android.location.GnssStatus.Callback【英文标题】:CallrequiresAPIlevel24(currentminis8):newandroid.location.GnssStatus.Callback【发布时间】:2016-12-2003:23:51【问题描述】:registerGnssStatusCallback是在API24中引入的... 查看详情

Android Play 商店最低目标 API 26

...间】:2019-06-2209:36:07【问题描述】:当我尝试上传目标API级别23的已签名APK时,我收到此错误:您应用的当前目标API级别为23,但最低目标API级别必须为26,以确保应用基于针对安全性和良好性能进行了优化的最新API。将应用的目... 查看详情

setAdapter“调用需要 API 级别 11(当前最低为 8):android.widget.AbsListView#setAdapter”?

】setAdapter“调用需要API级别11(当前最低为8):android.widget.AbsListView#setAdapter”?【英文标题】:setAdapter"CallrequiresAPIlevel11(currentminis8):android.widget.AbsListView#setAdapter"?【发布时间】:2012-09-1418:11:04【问题描述】:我在扩展Fr... 查看详情

调用需要 API 级别 21(当前最低为 17):android.hardware.camera2.CameraDevice.StateCallback

】调用需要API级别21(当前最低为17):android.hardware.camera2.CameraDevice.StateCallback【英文标题】:callrequiresAPIlevel21(currentminis17):android.hardware.camera2.CameraDevice.StateCallback【发布时间】:2017-02-2323:41:36【问题描述】:AndroidStudio中的错误... 查看详情

Android:无法在非静态方法中设置 getContext() - 需要 API 级别 23

...:2016-08-1216:27:32【问题描述】:下面是一些从非静态方法调用的源代码。我收到了错误"调用需要API级别23(当前最低为15);android.app.Fragment#getC 查看详情

android:Theme.Material.Light 需要 API 级别 21(当前最低为 8)

】android:Theme.Material.Light需要API级别21(当前最低为8)【英文标题】:android:Theme.Material.LightrequiresAPIlevel21(currentminis8)【发布时间】:2015-01-1509:18:35【问题描述】:我想在我的应用程序中使用材料主题,其最低sdk版本为8。根据文档... 查看详情

调用需要 API 级别 11(当前最小值为 1)

】调用需要API级别11(当前最小值为1)【英文标题】:CallrequiresAPIlevel11(currentminis1)【发布时间】:2013-10-2214:31:21【问题描述】:我刚刚删除了支持库(我将只支持一个API级别15的设备)并且我的代码在清理项目后运行良好。但是... 查看详情

Android PlayStore 警告您的应用当前针对 API 级别 25

】AndroidPlayStore警告您的应用当前针对API级别25【英文标题】:AndroidPlayStorewarningyourappcurrentlytargetsAPIlevel25【发布时间】:2018-12-3003:51:05【问题描述】:警告您的应用目前针对API级别25,并且必须针对最低API级别26,以确保它建立在... 查看详情

无法使用 HashMap 替换方法:调用需要 api 级别 24(当前最小值为 22):java.util.HashMap#replace

】无法使用HashMap替换方法:调用需要api级别24(当前最小值为22):java.util.HashMap#replace【英文标题】:CannotuseHashMapreplacemethod:callrequireapilevel24(currentminis22):java.util.HashMap#replace【发布时间】:2018-10-1120:09:21【问题描述】:各位,为... 查看详情

对于 API 级别最低为 21 的项目放弃 appcompat 是个好主意吗?

】对于API级别最低为21的项目放弃appcompat是个好主意吗?【英文标题】:IsitagoodideatoforgoappcompatforaprojectwithminimumAPIlevel21?【发布时间】:2016-06-2409:01:41【问题描述】:我正在启动一个最低API级别为21的项目,试图找出实现ActionBar的... 查看详情

非支持库 android 项目所需的最低 API 级别

...【发布时间】:2017-12-3117:02:27【问题描述】:有谁知道不需要任何支持库的Android项目的最低API级别是多少?21或22是我的猜测,但我可能错了。我未来的项目不需要任何支持库功能。【问题讨论】:它可能和API1一样古老。【参考... 查看详情

调用需要 API 26(最小为 18):android.app.NotificationChannel

】调用需要API26(最小为18):android.app.NotificationChannel【英文标题】:CallRequiresAPI26(minis18):android.app.NotificationChannel【发布时间】:2019-09-2210:30:55【问题描述】:我想在androidAPI我认为我的Gradle文件也有问题。我尝试添加条件为andro... 查看详情

主/明细流的最低 api 级别等于正在使用的级别

】主/明细流的最低api级别等于正在使用的级别【英文标题】:Master/Detailflowhasminimumapilevelequaltothatinuse【发布时间】:2013-11-0810:39:53【问题描述】:当我尝试在AndroidStudio中创建新的Master/Detail流活动时,我被告知“活动Master/DetailFl... 查看详情

为不同的 API 级别实现多个方法,而不是 if else 来决定调用哪一个

】为不同的API级别实现多个方法,而不是ifelse来决定调用哪一个【英文标题】:ImplementmultiplemethodsfordifferentAPIlevelsandnotdoifelsetodecidewhichonetocall【发布时间】:2019-08-2820:30:23【问题描述】:我想知道是否可以实现多种方法来支持不... 查看详情

将应用的目标 API 级别更改为至少 26

】将应用的目标API级别更改为至少26【英文标题】:Changeyourapp\'stargetAPIleveltoatleast26【发布时间】:2019-05-1512:37:49【问题描述】:当我在GooglePlay上发布我的应用时这向我展示了问题您的应用目前以API级别25为目标,并且必须至少... 查看详情

使用 android EncryptedSharedPreference 的最低 API 级别?

】使用androidEncryptedSharedPreference的最低API级别?【英文标题】:MinimumAPIlevelforusingandroidEncryptedSharedPreference?【发布时间】:2020-06-1820:43:43【问题描述】:androidencryptedShared首选项所需的最低API级别是多少?我正在使用以下依赖项impl... 查看详情

Android Google Maps V2 (17.0.0) 真正的最低 API 级别是多少?

...是,我目前正在使用play-services-maps17.0.0进行编译,这似乎需要安装特定版本 查看详情