Включить пошаговую подачу данных

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

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

Пошаговую ленту можно использовать для создания навигационных интерфейсов, когда полный интерфейс 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
Полное название дороги Оставшееся время
Значок маневра Расстояние до места назначения
Расстояние до следующего шага
Поля управления полосами движения

Руководство по выбору полосы движения

В навигационном 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 определяет в зависимости от стороны движения в стране. Например, в странах с левосторонним движением водители совершают круговой разворот или разворот по часовой стрелке, тогда как в странах с правосторонним движением — по часовой стрелке. Навигационный SDK определяет, происходит ли манёвр в лево- или правостороннем движении, и выводит соответствующий манёвр. Поэтому значок манёвра может отличаться для манёвра по часовой стрелке и против часовой стрелки.

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

Образец значка Маневры TurnByTurn
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 навигационный SDK поддерживает генерацию значков манёвров и подсказок по полосам движения. Эти значки соответствуют рекомендациям по размеру изображений библиотеки Android Auto Car App, которая рекомендует использовать рамку размером 500 x 74 dp. Подробнее см. в разделах setsLaneImage и CarIcon в справочной документации Android.

Пример генерации значка

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

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

Что дальше?