Plik danych zakręt po zakręcie dostarcza tylko informacji z nawigacji do urządzeń, które nie są przeznaczone do tego typu nawigacji. Dzięki nim możesz wykonać zadania, korzystając z dostarczanych przez Ciebie elementów:
- ikony (w lewo, w prawo, zawróć)
- numery skrętu na rondach
- nazwy dróg
- szacowana odległość i czas do następnego etapu nawigacji lub miejsca docelowego,
Dzięki kartom szczegółowych informacji możesz tworzyć doświadczenia w sytuacjach, w których pełny interfejs pakietu Navigation SDK nie jest odpowiedni, na przykład w przypadku Androida Auto lub w przypadku małych ekranów, gdy nie ma pełnego stosu Androida. Jest to przydatne na przykład w przypadku kierowców pojazdów dwukołowych, gdzie możesz wyświetlać wskazówki dotyczące nawigacji, aby szybciej i pewniej docierać do celu przy minimalnym rozpraszaniu uwagi.
Aby korzystać z pakietu SDK, musisz utworzyć usługę i zarejestrować ją w pakiecie SDK Navigation SDK na Androida, aby odbierała nowe informacje nawigacyjne w czasie rzeczywistym (mniej więcej raz na sekundę podczas nawigacji).
Z tego dokumentu dowiesz się, jak utworzyć i zarejestrować usługę nawigacji, która odbiera informacje nawigacyjne z pakietu SDK i udostępnia stan nawigacji urządzeniu odbierającemu.
Przegląd
W tej sekcji opisujemy, jak dodać bibliotekę TurnByTurn do projektów, oraz podsumowujemy ogólny proces tworzenia funkcji zakręt po zakręcie.
Dodaj bibliotekę TurnByTurn do projektu za pomocą narzędzia Maven (zalecane)
Aby skorzystać z samodzielnej wersji biblioteki TurnByTurn, wykonaj następujące czynności:
- Skonfiguruj środowisko, aby uzyskać dostęp do repozytorium Maven hosta:
Maven
Dodaj do pliku
pom.xml
te informacje:<project> ... <repositories> <repository> <id>google-maven-repository</id> <url>https://maven.google.com</url> </repository> </repositories> ... </project>
Gradle
Dodaj do pliku
build.gradle
te informacje:repositories { ... google() }
Dodaj tę zależność do konfiguracji Maven lub Gradle:
-
Maven
<dependencies> ... <dependency> <groupId>com.google.android.maps</groupId> <artifactId>google_turnbyturn</artifactId> <version>1.0.0</version> </dependency> </dependencies>
Gradle
dependencies { ... implementation 'com.google.android.maps:google_turnbyturn:1.0.0' }
Dodaj bibliotekę TurnByTurn do projektu za pomocą pobranego pliku JAR (alternatywnie)
Biblioteka TurnByTurn jest dostępna jako plik JAR w tym folderze pakietu SDK. Jeśli nie masz dostępu, skontaktuj się z przedstawicielem.
- Pobierz i rozpakuj
google_turnbyturn_*.jar
. - Skopiuj pobrany plik JAR do katalogu
app/libs
projektu. Dodaj ten kod do pliku
build.gradle
, aby uwzględnić plik JAR w kompilacji.dependencies { ... api fileTree(include: ['*.jar'], dir: 'libs') }
Korzystanie z biblioteki TurnByTurn
Oto ogólne kroki, które musisz wykonać, aby włączyć funkcję zakręt po zakręcie. W sekcjach poniżej znajdziesz szczegółowe informacje o poszczególnych krokach.
Utwórz usługę, aby otrzymywać aktualizacje nawigacji
Navigation SDK tworzy powiązanie z usługą TurnByTurn i wysyła do niej aktualizacje nawigacji przez Android Messenger. Na potrzeby tych aktualizacji możesz utworzyć nową usługę nawigacji lub użyć istniejącej.
Zaletą korzystania z usługi do otrzymywania aktualizacji nawigacji jest to, że może ona działać w osobnym procesie w tle.
Usługa w poniższym przykładzie odbiera informacje nawigacyjne i używa TurnByTurnManager
do konwertowania danych na obiekt NavInfo
, który zawiera szczegóły nawigacji.
/** * 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())); }
Kody wiadomości
Wiadomości NavInfo
można zidentyfikować za pomocą pola Message.what klasy Message
, które ma wartość TurnByTurnManager.MSG_NAV_INFO
.
Rejestrowanie usługi na potrzeby aktualizacji nawigacji
Poniższe fragmenty kodu rejestrują usługę nawigacji.
boolean isNavInfoReceivingServiceRegistered = navigator.registerServiceForNavUpdates( getPackageName(), NavInfoReceivingService.class.getName(), numNextStepsToPreview);
Uruchamianie i zatrzymywanie usługi
Usługa nawigacji jest aktywna, dopóki powiąże z nią pakiet SDK nawigacji. Możesz ręcznie wywoływać startService()
i stopService()
, aby kontrolować cykl życia usługi nawigacji, ale gdy zarejestrujesz usługę w pakiecie SDK nawigacji, usługa uruchomi się automatycznie i zatrzymuje się tylko po jej wyrejestrowaniu. W zależności od konfiguracji aplikacji możesz rozważyć uruchomienie usługi na pierwszym planie, opisanej w dokumentacji Androida Omówienie usług.
Wyrejestrowywanie usługi
Aby przestać otrzymywać aktualizacje nawigacji, wyrejestruj usługę z pakietu SDK Navigation.
navigator.unregisterServiceForNavUpdates();
Informacje o stanach nawigacji
Użyj pola NavInfo.getNavState()
, by sprawdzić bieżący stan nawigacji, czyli jeden z tych:
Trasa – stan
ENROUTE
oznacza, że nawigacja z przewodnikiem jest w tej chwili aktywna, a użytkownik korzysta z wyznaczonej trasy. Dostępne są informacje o nadchodzącym kroku manewru.Zmiana trasy –
REROUTING
oznacza, że nawigacja trwa, ale nawigacja szuka nowej trasy. Następny krok manewru jest niedostępny, ponieważ nie ma jeszcze nowej trasy. W przykładowej aplikacji na ekranie z informacjami nawigacyjnym pojawi się komunikat „Ponowne wyznaczanie trasy...”. Po znalezieniu trasy wysyłana jest wiadomośćNavInfo
ze stanemENROUTE
.Zatrzymano –
STOPPED
oznacza, że nawigacja została zakończona. Na przykład nawigacja zatrzymuje się, gdy użytkownik wyjdzie z aplikacji. W przykładowej aplikacji stanSTOPPED
czyści ekran z informacjami nawigacyjnymi, aby zapobiec wyświetlaniu zbędnych instrukcji dotyczących kroku.
Wypełnianie widoku kanału
Po skonfigurowaniu usługi zakręt po zakręcie ta sekcja obejmuje elementy wizualne i tekstowe, których możesz użyć do wypełnienia kart ze wskazówkami dotyczącymi wskazówek zakręt po zakręcie.
Pola informacji na karcie nawigacyjnej
Gdy użytkownik uruchamia nawigację z przewodnikiem, u góry pojawia się karta nawigacyjna zawierająca dane nawigacji pobrane z pakietu SDK nawigacji. Powiązany obraz przedstawia przykład tych niezbędnych elementów nawigacyjnych.
Ta tabela zawiera pola na informacje nawigacyjne i miejsca, w których można je znaleźć.
Pola dla każdego kroku nawigacji | Pola dotyczące całej podróży |
---|---|
Znaleziono w: StepInfo |
Znaleziono w: NavInfo |
Pełna nazwa drogi | Pozostały czas |
Ikona manewru | Odległość do celu |
Odległość do następnego kroku | |
Pola informacji dotyczących pasa ruchu |
Asystent pasa ruchu
Pakiet Navigation SDK reprezentuje pasy na karcie nawigacji jako obiekty danych Lane i LaneDirection. Obiekt Lane
reprezentuje konkretny pas podczas nawigacji i zawiera listę obiektów LaneDirection
opisujących wszystkie skręty, jakie można wykonać na tym pasie.
Zalecany kierunek jazdy, który powinien wybrać użytkownik pasa, jest zaznaczony w polu isRecommended.
Przykład asystenta pasa ruchu
Ten fragment przedstawia dane dotyczące pasów widocznych powyżej.
// Lane 1
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false},
{/*laneShape=*/ SLIGHT_LEFT, /*isRecommended=*/ true}]
// Lane 2
LaneDirections = [{/*laneShape=*/ STRAIGHT, /*isRecommended=*/ false}]
Twórz ikony do wykonywania manewrów
Wyliczenie Maneuver
określa każdy możliwy manewr, który może wystąpić podczas nawigacji. Możesz wykonać manewr dla danego kroku za pomocą metody StepInfo.getManeuver()
.
Musisz utworzyć ikony manewrowe i połączyć je z powiązanymi manewrami.
W przypadku niektórych manewrów możesz skonfigurować mapowanie ikon, np. DESTINATION_LEFT
i DESTINATION_RIGHT
. Ponieważ jednak niektóre manewry są podobne,
do jednej ikony możesz przypisać więcej niż jeden manewr. Na przykład TURN_LEFT
i ON_RAMP_LEFT
mogą być mapowane na ikonę skrętu w lewo.
Niektóre manewry zawierają dodatkową etykietę clockwise
lub counterclockwise
, którą pakiet SDK określa na podstawie ruchu w danym kraju. Na przykład w krajach, w których kierowcy jeżdżą po lewej stronie drogi, kierowcy kręcą rondo lub zawracać w kierunku zgodnym z ruchem wskazówek zegara, a w krajach z prawą stroną drogi jechać zgodnie z ruchem wskazówek zegara. Pakiet Navigation SDK wykrywa, czy ruch ma miejsce w ruchu po lewej czy prawej stronie, i wykonuje odpowiedni ruch. Z tego powodu ikona może być inna w przypadku skrętu w prawo i w lewo.
Rozwiń, aby zobaczyć przykładowe ikony dla różnych manewrów
Ikona przykładowej | Makiety 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
|
Użyj wygenerowanych ikon
Aby ułatwić korzystanie z Androida Auto, pakiet Navigation SDK obsługuje generowanie ikon skrętu i asystenta pasa ruchu. Te ikony pasują do wytycznych dotyczących rozmiaru obrazu dostępnych w bibliotece aplikacji samochodowej na Androida Auto, która zaleca kierowanie na ramkę ograniczającą o wymiarach 500 x 74 dp. Szczegółowe informacje znajdziesz w sekcjach setsLaneImage i CarIcon w dokumentacji Androida.
Przykład generowania ikon
NavigationUpdatesOptions options =
NavigationUpdatesOptions.builder()
.setNumNextStepsToPreview(numNextStepsToPreview)
.setGeneratedStepImagesType(GeneratedStepImagesType.BITMAP)
.setDisplayMetrics(getResources().getDisplayMetrics())
.build();
boolean isRegistered =
navigator.registerServiceForNavUpdates(
getPackageName(),
NavInfoReceivingService.class.getName(),
options);
Po włączeniu generowania ikon obiekt TurnbyTurn StepInfo
zapełnia pola maneuverBitmap i lanesBitmap ikonami.
Co dalej?
- W przypadku aplikacji na Androida Auto: