Как включить фид данных для пошаговой навигации

Фид данных пошаговой навигации предоставляет информацию только о навигации для устройств, не предназначенных для навигации по карте. Он предоставляет предстоящие маневры с элементами, которые вы предоставляете:

  • значки (поворот налево, поворот направо, разворот)
  • Поворотные номера на круговых перекрестках
  • названия дорог
  • расчетное расстояние и время до следующего шага навигации или конечного пункта назначения;

Фид пошаговой навигации можно использовать в тех случаях, когда полный интерфейс Navigation SDK не подходит, например в Android Auto или на небольших экранах, где полный стек Android недоступен. Например, вы можете использовать его для водителей двухколесных транспортных средств, которым можно показывать только навигационные подсказки, чтобы помочь им быстрее и увереннее добираться до места назначения с минимальным количеством отвлекающих факторов.

Чтобы использовать SDK, создайте сервис и зарегистрируйте его в Navigation SDK для Android. Это позволит получать новую информацию о навигации в реальном времени (примерно раз в секунду во время навигации).

В этом документе рассказывается, как создать и зарегистрировать сервис навигации, который получает информацию о навигации от SDK и передает состояние навигации на принимающее устройство.

Обзор

В этом разделе кратко описан процесс включения пошаговой навигации.

Как использовать функцию TurnByTurn

Ниже приведены основные шаги по включению функции пошаговой навигации. Ниже все эти этапы описаны более подробно.

  1. Создайте сервис для получения обновлений навигации.

  2. Зарегистрируйте сервис.

  3. О статусах навигации

Как создать сервис для получения обновлений навигации

Navigation SDK подключается к вашему сервису TurnByTurn и отправляет ему обновления навигации через Android Messenger. Вы можете создать новый сервис навигации для этих обновлений или использовать существующий.

Преимущество использования сервиса для получения обновлений навигации заключается в том, что сервис может работать в отдельном фоновом процессе.

В примере ниже сервис получает информацию о навигации и использует TurnByTurnManager, чтобы преобразовать данные в объект NavInfo, содержащий сведения о навигации.

/**
 *   Receives turn-by-turn navigation information forwarded from NavSDK.
 */
public class NavInfoReceivingService extends Service {
  /** The messenger used by the service to receive nav step updates. */
  private Messenger incomingMessenger;
  private TurnByTurnManager turnByTurnManager;

  private final class IncomingNavStepHandler extends Handler {
    public IncomingNavStepHandler(Looper looper) {
      super(looper);
    }

    @Override
    public void handleMessage(Message msg) {
      // Identify the message through the msg.what field.
      if (TurnByTurnManager.MSG_NAV_INFO == msg.what) {
        // Extract the NavInfo object using the TurnByTurnManager.
        NavInfo navInfo = turnByTurnManager
          .readNavInfoFromBundle(msg.getData()));
      // Do something with the NavInfo
    }
  }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
  return incomingMessenger.getBinder();
}

@Override
public void onCreate() {
  turnByTurnManager = TurnByTurnManager.createInstance();
  HandlerThread thread =
    new HandlerThread("NavInfoReceivingService",
      Process.THREAD_PRIORITY_DEFAULT);
  thread.start();
  incomingMessenger = new Messenger(
    new IncomingNavStepHandler(thread.getLooper()));
}

Коды сообщений

Сообщения NavInfo можно идентифицировать по полю Message.what класса Message, которому задано значение TurnByTurnManager.MSG_NAV_INFO.

Регистрация сервиса для обновления навигации

В приведенных ниже фрагментах кода показано, как зарегистрировать сервис навигации.

boolean isNavInfoReceivingServiceRegistered =
          navigator.registerServiceForNavUpdates(
              getPackageName(), NavInfoReceivingService.class.getName(), numNextStepsToPreview);

Запуск и остановка службы

Сервис навигации активен, пока к нему привязан Navigation SDK. Вы можете вручную вызывать методы startService() и stopService(), чтобы управлять жизненным циклом сервиса навигации. Однако если вы зарегистрируете свой сервис в Navigation SDK, он будет запускаться автоматически и останавливаться только после отмены регистрации. В зависимости от того, как настроено приложение, вы можете запустить активную службу, описанную в документации по Android.

Отмена регистрации сервиса

Чтобы прекратить получать обновления навигации, отмените регистрацию сервиса в Navigation SDK.

navigator.unregisterServiceForNavUpdates();

Состояния навигации

Используйте NavInfo.getNavState(), чтобы получить текущий статус навигации, который может быть одним из следующих:

  • Enroute – состояние ENROUTE означает, что навигация активна и пользователь находится на маршруте. Доступна информация о текущем предстоящем маневре.

  • Обновление маршрута (REROUTING) – навигация выполняется, но навигатор ищет новый маршрут. Информация о следующем маневре недоступна, поскольку новый маршрут ещё не построен. В примере приложения на экране навигации появляется сообщение "Перерасчет маршрута…". Когда маршрут найден, отправляется сообщение NavInfo со статусом ENROUTE.

  • Остановлено – STOPPED означает, что навигация завершена. Например, навигация прекращается, когда пользователь выходит из режима навигации в приложении. В примере приложения состояние STOPPED очищает экран с информацией о навигации, чтобы не отображались оставшиеся пошаговые инструкции.

Заполните фид

Теперь, когда вы настроили сервис пошаговой навигации, в этом разделе рассматриваются визуальные и текстовые элементы, которые можно использовать для заполнения карточек подсказок для фида пошаговой навигации.

Экран мобильного устройства, на котором показан предстоящий поворот налево через 100 футов на улицу W Ahwanee Ave. В нижней части экрана указано время до пункта назначения – 46 минут, а оставшееся расстояние – 39 миль.

Когда пользователь переходит в режим навигации, вверху появляется карточка с данными, полученными из Navigation SDK. На сопутствующем изображении показан пример этих основных элементов навигации.

В таблице ниже перечислены поля с информацией о навигации и указано, где их найти.

Поля для каждого шага навигации Поля для всей поездки
Найдено в StepInfo Найдено в NavInfo
Полное название дороги Оставшееся время
Значок маневра. Расстояние до пункта назначения
Расстояние до следующего шага
Поля для выбора полосы движения

выбор полосы движения;

Navigation SDK представляет полосы на карточке поворота в виде объектов данных Lane и LaneDirection. Объект Lane представляет определенную полосу движения во время навигации и содержит список объектов LaneDirection, которые описывают все повороты, которые можно сделать с этой полосы.

Пример конфигурации подсказок по выбору полосы движения.

Рекомендуемое направление движения по полосе указывается в поле isRecommended.

Пример выбора полосы движения

Ниже показано, как представляются данные о полосах, изображенных на рисунке выше.

// Lane 1
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false},
                  {/*laneShape=*/ SLIGHT_LEFT, /*isRecommended=*/ true}]

// Lane 2
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false}]

Создание значков для маневров

Перечисление Maneuver определяет все возможные маневры, которые могут произойти во время навигации. Получить маневр для определенного шага можно с помощью метода StepInfo.getManeuver().

Вы должны создать значки маневров и связать их с соответствующими маневрами. Для некоторых маневров можно настроить сопоставление со значком один к одному, например DESTINATION_LEFT и DESTINATION_RIGHT. Однако, поскольку некоторые маневры похожи, вы можете сопоставить несколько маневров с одним значком. Например, TURN_LEFT и ON_RAMP_LEFT могут соответствовать значку поворота налево.

Некоторые маневры содержат дополнительную метку clockwise или counterclockwise, которую SDK определяет на основе стороны движения в стране. Например, в странах с левосторонним движением водители проезжают круговые перекрестки и разворачиваются по часовой стрелке, а в странах с правосторонним движением – против часовой стрелки. Navigation SDK определяет, происходит ли маневр в левостороннем или правостороннем движении, и выводит соответствующий маневр. Поэтому значок маневра по часовой стрелке может отличаться от значка маневра против часовой стрелки.

Развернуть, чтобы посмотреть примеры значков для разных маневров

Пример значка Пошаговые маневры
DEPART
UNKNOWN
STRAIGHT
ON_RAMP_UNSPECIFIED
OFF_RAMP_UNSPECIFIED
NAME_CHANGE
TURN_RIGHT
ON_RAMP_RIGHT
TURN_LEFT
ON_RAMP_LEFT
TURN_SLIGHT_RIGHT
ON_RAMP_SLIGHT_RIGHT
OFF_RAMP_SLIGHT_RIGHT
TURN_SLIGHT_LEFT
ON_RAMP_SLIGHT_LEFT
OFF_RAMP_SLIGHT_LEFT
TURN_SHARP_RIGHT
ON_RAMP_SHARP_RIGHT
OFF_RAMP_SHARP_RIGHT
TURN_SHARP_LEFT
ON_RAMP_SHARP_LEFT
OFF_RAMP_SHARP_LEFT
TURN_U_TURN_COUNTERCLOCKWISE
ON_RAMP_U_TURN_COUNTERCLOCKWISE
OFF_RAMP_U_TURN_COUNTERCLOCKWISE
TURN_U_TURN_CLOCKWISE
ON_RAMP_U_TURN_CLOCKWISE
OFF_RAMP_U_TURN_CLOCKWISE
ROUNDABOUT_SHARP_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_RIGHT_CLOCKWISE
ROUNDABOUT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_RIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_RIGHT_CLOCKWISE
ROUNDABOUT_STRAIGHT_COUNTERCLOCKWISE
ROUNDABOUT_STRAIGHT_CLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SLIGHT_LEFT_CLOCKWISE
ROUNDABOUT_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_LEFT_CLOCKWISE
ROUNDABOUT_SHARP_LEFT_COUNTERCLOCKWISE
ROUNDABOUT_SHARP_LEFT_CLOCKWISE
ROUNDABOUT_U_TURN_COUNTERCLOCKWISE
ROUNDABOUT_U_TURN_CLOCKWISE
ROUNDABOUT_COUNTERCLOCKWISE
ROUNDABOUT_CLOCKWISE
ROUNDABOUT_EXIT_COUNTERCLOCKWISE
ROUNDABOUT_EXIT_CLOCKWISE
MERGE_RIGHT
OFF_RAMP_RIGHT
MERGE_LEFT
OFF_RAMP_LEFT
FORK_RIGHT
TURN_KEEP_RIGHT
ON_RAMP_KEEP_RIGHT
OFF_RAMP_KEEP_RIGHT
FORK_LEFT
TURN_KEEP_LEFT
ON_RAMP_KEEP_LEFT
OFF_RAMP_KEEP_LEFT
MERGE_UNSPECIFIED
DESTINATION
DESTINATION_RIGHT
DESTINATION_LEFT
FERRY_BOAT
FERRY_TRAIN

Как использовать сгенерированные значки

Небольшой список сгенерированных значков, предоставляемых Navigation SDK.

Для удобства использования Android Auto Navigation SDK поддерживает создание значков маневров и полос движения. Эти значки соответствуют рекомендациям по размеру изображений в библиотеке Car App Library для Android Auto, согласно которым размер ограничивающей рамки должен составлять 500 x 74 dp. Подробную информацию можно найти в справочной документации по Android в разделах setsLaneImage и CarIcon.

Пример сгенерированного значка

NavigationUpdatesOptions options =
  NavigationUpdatesOptions.builder()
             .setNumNextStepsToPreview(numNextStepsToPreview)
             .setGeneratedStepImagesType(GeneratedStepImagesType.BITMAP)
             .setDisplayMetrics(getResources().getDisplayMetrics())
             .build();
boolean isRegistered =
          navigator.registerServiceForNavUpdates(
              getPackageName(),
              NavInfoReceivingService.class.getName(),
              options);

После включения генерации значков объект TurnbyTurn StepInfo заполняет поля maneuverBitmap и lanesBitmap значками.

Дальнейшие действия