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

2022-09-03 09:35:12

我正在实现Google的Directions API。我的应用在这里支持,但不受支持。minSdkVersion 23java.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();

错误:

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


答案 1

如果您使用的是Gradle插件4.0或更高版本(与Android Studio 4.0或更高版本一起使用),则可以利用D8 Core Library Desugaring。这包括在中找到的功能子集,并允许您在项目中使用;即使您需要支持早于 API 26 的版本。java.timejava.time.Instant

在模块的文件中: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'
}

您现在应该能够毫无错误地使用此类。

一些来源:


答案 2

在查看了开发人员指南后,发现要么,Stringnow

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

departure_time— 指定所需的出发时间。您可以将时间指定为自 1970 年 1 月 1 日午夜 UTC 以来的整数(以秒为单位)。或者,您可以指定一个值 ,该值将出发时间设置为当前时间(正确到最接近的秒)。now

在检查客户端的源代码时,有一种方便的方法:Java

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

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


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


推荐