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

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

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

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

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

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

Обзор

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

Использование функции TurnByTurn

Ниже описаны основные шаги для включения функции пошаговой навигации. В последующих разделах подробно описан каждый шаг.

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

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

  3. Разберитесь в состояниях навигации .

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

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);

Запуск и остановка сервиса

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

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

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

navigator.unregisterServiceForNavUpdates();

Понимание состояний навигации

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

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

  • Перенаправление маршрутаREROUTING означает, что навигация находится в процессе, но навигатор ищет новый маршрут. Следующий шаг маневра недоступен, поскольку нового маршрута еще нет. В примере приложения на экране информации о навигации появляется сообщение "Перенаправление маршрута...". Как только маршрут найден, отправляется сообщение NavInfo со состоянием ENROUTE .

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

Заполнить ленту новостей

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

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

Когда пользователь переходит в режим навигации с подсказками, вверху появляется навигационная карточка, содержащая навигационные данные, заполненные из 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 определяет в зависимости от направления движения в стране. Например, в странах с левосторонним движением водители совершают круговое движение или разворот по часовой стрелке, тогда как в странах с правосторонним движением движение происходит по часовой стрелке. Навигационный 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, SDK навигации поддерживает генерацию значков для управления движением и указания полосы движения. Эти значки соответствуют рекомендациям по размеру изображений библиотеки Android Auto Car App, которая рекомендует использовать ограничивающую рамку размером 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 значками.

Что дальше?