我正在实现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
答案 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)
java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
org.threeten.bp
导入日期和时间类。java.time
。java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。答案 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个。