Вызов требует API уровня 26 (текущий минимум 23): java.time.Instant# сейчас
Я использую Google 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# теперь меньше... (Ctrl+F1) Информация о проверке: эта проверка просматривает все вызовы API Android в приложении и предупреждает о любых вызовах, которые доступно не во всех версиях, на которые ориентировано это приложение (в соответствии с его минимальным атрибутом SDK в манифесте). Если вы действительно хотите использовать этот API и не нуждаетесь в поддержке старых устройств, просто установите minSdkVersion в ваших файлах build.gradle или AndroidManifest.xml. Если ваш код преднамеренно обращается к новым API, и вы гарантировали (например, при условном выполнении), что этот код будет вызываться только на поддерживаемой платформе, тогда вы можете аннотировать свой класс или метод с помощью аннотации @TargetApi, определяющей локальный минимальный SDK применить, например @TargetApi(11), чтобы эта проверка учитывала 11, а не минимальный SDK вашего файла манифеста в качестве требуемого уровня API. Если вы намеренно устанавливаете атрибуты android: в определениях стилей, убедитесь, что вы поместили их в папку values-vNN, чтобы избежать конфликтов во время выполнения на определенных устройствах, где производители добавили пользовательские атрибуты, чьи идентификаторы конфликтуют с новыми на более поздних платформах., Точно так же вы можете использовать tools:targetApi="11" в файле XML, чтобы указать, что элемент будет раздуваться только в соответствующем контексте. Идентификатор проблемы: NewApi
2 ответа
Изучив руководство разработчика, выяснилось, что либо String
now
,
а также обычный int
Временные метки эпохи UNIX являются приемлемыми значениями:
departure_time
- Указывает желаемое время отправления. Вы можете указать время как целое число в секундах с полуночи 1 января 1970 года по Гринвичу. Кроме того, вы можете указать значениеnow
, который устанавливает время отправления на текущее время (с точностью до секунды).
При проверке исходного кода Java
клиент, для этого есть удобный метод:
public DirectionsApiRequest departureTimeNow() {
return param("departure_time", "now");
}
Следовательно java.time.Instant
можно обойти, для обратной совместимости.
Я подал вопрос № 559... кажется, что разветвление библиотеки - единственный способ установить другие метки времени.
Если вы используете подключаемый модуль 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'
}
Теперь вы можете использовать этот класс без ошибок.
Некоторые источники:
Вы можете использовать класс Instant и другие классы из java.time на уровне API Android 23.
java.time прекрасно работает как на старых, так и на новых устройствах Android. Просто требуется как минимум Java 6.
- В Java 8 и новее, а также на новых устройствах Android (начиная с уровня API 26) современный API встроен.
- В Java 6 и 7, отличных от Android, используйте ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).
- На (более старом) Android используйте Android-версию ThreeTen Backport. Это называется ThreeTenABP. И убедитесь, что вы импортируете классы даты и времени из
org.threeten.bp
с подпакетами.
Ссылки
- Учебник Oracle: Date Time, объясняющий, как использовать java.time.
- Запрос спецификации Java (JSR) 310, где
java.time
был впервые описан. - Проект ThreeTen Backport, то портировать из
java.time
на Java 6 и 7 (ThreeTen для JSR-310). - ThreeTenABP, версия ThreeTen Backport для Android
- Вопрос: как использовать ThreeTenABP в Android Project, с очень подробным объяснением.
Я написал о рекомендуемом подходе для решения этой проблемы здесь: https://dev.to/cicerohellmann/what-is-desugaring-and-why-would-i-need-it-2bo0
Но вкратце вы должны использовать обессахаривание, это позволяет вам использовать некоторые API высокого уровня на более низких уровнях. Стоит проверить. Я также добавил все ссылки, чтобы найти способ его реализовать, а также некоторые плюсы и минусы в этом.
Нет другого способа сделать это. Вы не можете использовать API, для которого требуется более высокая версия SDK с более низкой.
Вы должны изменить minSdkVersion
свойство на уровне приложения build.gradle
с 23 файла до 26.