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







































