Пошаговая навигация предоставляет информацию только для навигации устройствам, не предназначенным для навигации по картам. Она отображает предстоящие маневры с использованием предоставленных вами элементов:
- значки (влево, вправо, разворот)
- Номера поворотов на круговых перекрестках
- названия дорог
- расчетные расстояния и время до следующего этапа навигации или конечного пункта назначения
Вы можете использовать пошаговую навигацию для создания сценариев, где полный интерфейс Navigation SDK не подходит, например, для Android Auto или для небольших экранов, где недоступен полный стек Android. Например, это может быть полезно для водителей двухколесных транспортных средств, позволяя проецировать только навигационные подсказки, чтобы помочь им быстрее и увереннее добраться до места назначения с минимальным количеством отвлекающих факторов.
Для использования SDK вам потребуется создать службу и зарегистрировать её в Navigation SDK для Android, чтобы она могла получать новую навигационную информацию в режиме реального времени (примерно раз в секунду во время навигации).
В этом документе показано, как создать и зарегистрировать навигационную службу, которая получает навигационную информацию из SDK и передает состояние навигации принимающему устройству.
Обзор
В этом разделе кратко описан общий алгоритм включения функции пошаговой навигации.
Использование функции TurnByTurn
Ниже описаны основные шаги для включения функции пошаговой навигации. В последующих разделах подробно описан каждый шаг.
Создайте службу для получения обновлений навигации.
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очищает экран с информацией о навигации, чтобы предотвратить отображение оставшихся инструкций.
Заполнить ленту новостей
Теперь, когда вы настроили свою систему пошаговых инструкций, в этом разделе рассматриваются визуальные и текстовые элементы, которые вы можете использовать для заполнения карточек с инструкциями для системы пошаговых инструкций.
Поля информации в навигационной карточке

Когда пользователь переходит в режим навигации с подсказками, вверху появляется навигационная карточка, содержащая навигационные данные, заполненные из 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 определяет, происходит ли маневр в левостороннем или правостороннем потоке транспорта, и выдает соответствующий результат. Поэтому значок маневра может отличаться для движения по часовой стрелке и против часовой стрелки.
Разверните, чтобы увидеть примеры значков для различных маневров.
| Образец значка | Пошаговые маневры |
|---|---|
![]() | DEPARTUNKNOWN |
![]() | STRAIGHTON_RAMP_UNSPECIFIEDOFF_RAMP_UNSPECIFIEDNAME_CHANGE |
![]() | TURN_RIGHTON_RAMP_RIGHT |
![]() | TURN_LEFTON_RAMP_LEFT |
![]() | TURN_SLIGHT_RIGHTON_RAMP_SLIGHT_RIGHTOFF_RAMP_SLIGHT_RIGHT |
![]() | TURN_SLIGHT_LEFTON_RAMP_SLIGHT_LEFTOFF_RAMP_SLIGHT_LEFT |
![]() | TURN_SHARP_RIGHTON_RAMP_SHARP_RIGHTOFF_RAMP_SHARP_RIGHT |
![]() | TURN_SHARP_LEFTON_RAMP_SHARP_LEFTOFF_RAMP_SHARP_LEFT |
![]() | TURN_U_TURN_COUNTERCLOCKWISEON_RAMP_U_TURN_COUNTERCLOCKWISEOFF_RAMP_U_TURN_COUNTERCLOCKWISE |
![]() | TURN_U_TURN_CLOCKWISEON_RAMP_U_TURN_CLOCKWISEOFF_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_RIGHTOFF_RAMP_RIGHT |
![]() | MERGE_LEFTOFF_RAMP_LEFT |
![]() | FORK_RIGHTTURN_KEEP_RIGHTON_RAMP_KEEP_RIGHTOFF_RAMP_KEEP_RIGHT |
![]() | FORK_LEFTTURN_KEEP_LEFTON_RAMP_KEEP_LEFTOFF_RAMP_KEEP_LEFT |
![]() | MERGE_UNSPECIFIED |
![]() | DESTINATION |
![]() | DESTINATION_RIGHT |
![]() | DESTINATION_LEFT |
![]() | FERRY_BOAT |
![]() | FERRY_TRAIN |
Используйте сгенерированные значки
![]()
Для упрощения использования 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 значками.
Что дальше?
- Для приложений Android Auto :







































