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

时间:2019-04-06 16:09:14

标签: java android google-direction

我正在实现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();

错误:

  

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

5 个答案:

答案 0 :(得分:14)

如果您使用的是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'
}

您现在应该可以免费使用此类。

某些来源:

答案 1 :(得分:2)

查看developer guide后,发现Not a function String

以及常见的now UNIX时代时间戳都是可接受的值:

  

int-指定所需的出发时间。您可以将时间指定为自UTC 1970年1月1日午夜以来的秒数。另外,您可以指定一个值departure_time,该值将出发时间设置为当前时间(更正为最近的秒)。

在检查now客户端的source code时,有一种简便的方法:

Java

因此,为了向后兼容,可以绕开public DirectionsApiRequest departureTimeNow() { return param("departure_time", "now"); }


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

答案 2 :(得分:1)

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

java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

  • 在Java 8和更高版本以及更新的Android设备(API级别26以上)中,内置了现代API。
  • 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的backport(ThreeTen for JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android系统上使用Android版的ThreeTen Backport。叫做ThreeTenABP。并确保您使用子包从org.threeten.bp导入日期和时间类。

链接

答案 3 :(得分:1)

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

但是简短地说,您应该使用desugaring,它允许您在较低级别使用一些高级api。值得检查。我还添加了所有链接,以查找要实施它的ho以及有关它的一些利弊

答案 4 :(得分:0)

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

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