Вызов требует 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 ответа

Решение

Изучив руководство разработчика, выяснилось, что либо Stringnow,

а также обычный 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 с подпакетами.

Ссылки

Я написал о рекомендуемом подходе для решения этой проблемы здесь: https://dev.to/cicerohellmann/what-is-desugaring-and-why-would-i-need-it-2bo0

Но вкратце вы должны использовать обессахаривание, это позволяет вам использовать некоторые API высокого уровня на более низких уровнях. Стоит проверить. Я также добавил все ссылки, чтобы найти способ его реализовать, а также некоторые плюсы и минусы в этом.

Нет другого способа сделать это. Вы не можете использовать API, для которого требуется более высокая версия SDK с более низкой.

Вы должны изменить minSdkVersion свойство на уровне приложения build.gradle с 23 файла до 26.

Другие вопросы по тегам