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