Dzięki pakietowi Maps SDK na Androida możesz utworzyć aplikację na urządzenie do noszenia opartą na mapach, która działa bezpośrednio na urządzeniach z Wear OS by Google. Użytkownicy Twojej aplikacji może sprawdzić ich lokalizację na mapie, patrząc na nadgarstki. Mogą sprawdzić ich pozycję na trasie, a następnie powiększyć widok, aby uzyskać szczegóły, lub kliknąć aby zobaczyć okno informacyjne dostarczone przez Twoją aplikację.
Na tej stronie opisaliśmy funkcje interfejsu API dostępne na urządzeniu Wear OS oraz ułatwiliśmy Ci rozpoczęcie tworzenia aplikacji.
Pierwsze kroki z Wear OS
Tworzenie aplikacji na urządzenia noszące z pakietem Maps SDK na Androida jest zasadniczo takie samo jak tworzenie aplikacji Mapy Google na dowolne inne urządzenie z Androidem. Różnica jest odpowiedni pod względem konstrukcji mniejszych urządzeń. optymalizować łatwość obsługi i wydajność aplikacji.
Android Studio to zalecane narzędzie do tworzenia aplikacji na Wear OS, ponieważ umożliwia konfigurowanie projektu, dodawanie bibliotek i pakowanie aplikacji.
Ogólne wskazówki dotyczące projektowania aplikacji na urządzenia noszące znajdziesz w wytycznych dotyczących projektowania aplikacji na Wear OS. Aby uzyskać pomoc przy tworzeniu pierwszej aplikacji do noszenia, przeczytaj przewodnik tworzenia takich aplikacji.
Tworzenie pierwszej aplikacji map na Wear OS
W tym krótkim przewodniku zakładamy, że znasz pakiet Maps SDK na Androida, że wiesz, jak utworzyć moduł na urządzenia do noszenia w swojej aplikacji zgodnie z wytycznymi dotyczącymi Wear OS, i że chcesz teraz dodać mapę do tego modułu.
Dodawanie zależności dla modułu Wear
Sprawdź, czy plik build.gradle.kts
zawiera te zależności
modułu Wear OS aplikacji:
dependencies { // ... compileOnly("com.google.android.wearable:wearable:2.9.0") implementation("com.google.android.support:wearable:2.9.0") implementation("com.google.android.gms:play-services-maps:19.0.0") // This dependency is necessary for ambient mode implementation("androidx.wear:wear:1.3.0") }
Więcej informacji o zależnościach znajdziesz w przewodniku Dodawanie modułu Wear OS do istniejącego projektu.
Wdrażanie gestu przesunięcia w bok w celu zamknięcia i ustawienie początkowego koloru tła
Zalecamy wyświetlanie mapy na urządzeniu do noszenia za pomocą SwipeDismissFrameLayout
. Za pomocą zajęć SwipeDismissFrameLayout
możesz:
zaimplementuj gest przesuń, aby zamknąć, dając użytkownikom
aby wyjść z aplikacji, przesuń palcem od lewej krawędzi ekranu.
Aby ustawić niestandardowy początkowy kolor tła, użyj atrybutu XML map:backgroundColor
, aby określić kolor, który ma być wyświetlany do momentu załadowania się rzeczywistych płytek mapy.
Dodaj do układu elementy SwipeDismissFrameLayout
i backgroundColor
definicja jako kontener tabeli SupportMapFragment
:
<androidx.wear.widget.SwipeDismissFrameLayout android:id="@+id/map_container" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" map:backgroundColor="#fff0b2dd" /> </androidx.wear.widget.SwipeDismissFrameLayout>
Gdy zdobędziesz obiekt SwipeDismissFrameLayout
, dodaj do aktywności
wywołanie zwrotne i ustawić działanie wywołania zwrotnego w celu wykonania niezbędnego odrzucenia,
działanie jak poniżej:
Kotlin
class MainActivity : AppCompatActivity(), OnMapReadyCallback, AmbientModeSupport.AmbientCallbackProvider { public override fun onCreate(savedState: Bundle?) { super.onCreate(savedState) // Set the layout. It only contains a SupportMapFragment and a DismissOverlay. setContentView(R.layout.activity_main) // Enable ambient support, so the map remains visible in simplified, low-color display // when the user is no longer actively using the app but the app is still visible on the // watch face. val controller = AmbientModeSupport.attach(this) Log.d(MainActivity::class.java.simpleName, "Is ambient enabled: " + controller.isAmbient) // Retrieve the containers for the root of the layout and the map. Margins will need to be // set on them to account for the system window insets. val mapFrameLayout = findViewById<SwipeDismissFrameLayout>(R.id.map_container) mapFrameLayout.addCallback(object : SwipeDismissFrameLayout.Callback() { override fun onDismissed(layout: SwipeDismissFrameLayout) { onBackPressed() } }) // Obtain the MapFragment and set the async listener to be notified when the map is ready. mapFragment = supportFragmentManager .findFragmentById(R.id.map) as SupportMapFragment mapFragment.getMapAsync(this) } // ... }
Java
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback, AmbientModeSupport.AmbientCallbackProvider { public void onCreate(Bundle savedState) { super.onCreate(savedState); // Set the layout. It only contains a SupportMapFragment and a DismissOverlay. setContentView(R.layout.activity_main); // Enable ambient support, so the map remains visible in simplified, low-color display // when the user is no longer actively using the app but the app is still visible on the // watch face. AmbientModeSupport.AmbientController controller = AmbientModeSupport.attach(this); Log.d(MainActivity.class.getSimpleName(), "Is ambient enabled: " + controller.isAmbient()); // Retrieve the containers for the root of the layout and the map. Margins will need to be // set on them to account for the system window insets. final SwipeDismissFrameLayout mapFrameLayout = (SwipeDismissFrameLayout) findViewById( R.id.map_container); mapFrameLayout.addCallback(new SwipeDismissFrameLayout.Callback() { @Override public void onDismissed(SwipeDismissFrameLayout layout) { onBackPressed(); } }); // Obtain the MapFragment and set the async listener to be notified when the map is ready. mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } // ... }
Dodawanie mapy
Aby uzyskać uchwyt do obiektu GoogleMap, użyj zwykłej metody wywołania zwrotnego onMapReady(GoogleMap)
. Wywołanie zwrotne jest wywoływane, gdy mapa jest gotowa do użycia. W metodzie wywołania zwrotnego możesz
dodać znaczniki lub linie łamane do mapy, dodać detektory lub przesunąć kamerę. Przykład poniżej pokazuje dodanie znacznika w pobliżu opery w Sydney:
Kotlin
private val sydney = LatLng(-33.85704, 151.21522) override fun onMapReady(googleMap: GoogleMap) { // Add a marker with a title that is shown in its info window. googleMap.addMarker( MarkerOptions().position(sydney) .title("Sydney Opera House") ) // Move the camera to show the marker. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 10f)) }
Java
private static final LatLng SYDNEY = new LatLng(-33.85704, 151.21522); @Override public void onMapReady(@NonNull GoogleMap googleMap) { // Add a marker with a title that is shown in its info window. googleMap.addMarker(new MarkerOptions().position(SYDNEY) .title("Sydney Opera House")); // Move the camera to show the marker. googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(SYDNEY, 10)); }
Włączanie trybu nieaktywnego
Pakiet SDK Map na Androida obsługuje tryb ambient w aplikacjach na urządzenia noszące. Aplikacje obsługujące tryb dźwięków otoczenia są czasami nazywane aplikacją zawsze włączoną. Tryb nieaktywny jest aktywowany, gdy użytkownik nie korzysta już aktywnie z aplikacji, i pozwala aplikacji pozostać widocznej na urządzeniu do noszenia.
Maps SDK na Androida upraszcza renderowanie bez kolorów do użycia w trybie nieaktywnym, a styl mapy zostanie automatycznie dostosowany, urządzenie przełącza się z trybu interaktywnego w tryb nieaktywny. Wszystkie znaczniki, obiekty i elementy sterujące interfejsu znikają w trybie otoczenia. Zmniejsza to zużycie energii aplikacji oraz zapewnia spójność jej wyglądu i stylu z innymi aplikacjami do obsługi otoczenia, takich jak tarcze zegarka.
Aby mieć pewność, że Twoja aplikacja korzysta z trybu nieaktywnej mapy:
- Zaktualizuj pakiet SDK Androida, aby uwzględniał platformę Androida 6.0 (poziom interfejsu API 23) lub nowszą, która udostępnia interfejsy API umożliwiające przechodzenie aktywności w tryb tła. Informacje o aktualizowaniu pakietu SDK znajdziesz w dokumentacji Androida dotyczącej dodawania pakietów SDK.
- Upewnij się, że Twój projekt jest kierowany na Androida 6.0 lub nowszego, ustawiając w pliku manifestu aplikacji parametr
targetSdkVersion
na 23 lub wyższy. - Dodaj zależności urządzenia do noszenia do pliku
build.gradle.kts
aplikacji. Zobacz znajdziesz na tej stronie. - Dodaj wpis biblioteki współdzielonej urządzenia do noszenia do manifestu aplikacji do noszenia jako omówiono w ramach szkolenia na temat Androida aby aplikacja była widoczna.
- Dodaj uprawnienie
WAKE_LOCK
do plików manifestu aplikacji na urządzenia mobilne i urządzenia do noszenia. jak opisano w zajęciach na temat Androida, aby aplikacja była widoczna. - W metodzie
onCreate()
aktywności wywołaj metodęAmbientModeSupport.attach()
. Informuje to system operacyjny, że aplikacja jest zawsze włączona, więc po wyłączeniu urządzenia powinna przejść w tryb ambient, a nie wracać do tarczy zegarka. - W swojej aktywności zaimplementuj interfejs
AmbientModeSupport.AmbientCallbackProvider
, aby mogła ona otrzymywać zmiany stanu w Trybie nieaktywnym. - Skonfiguruj mapę tak, aby obsługiwała dźwięki otoczenia. Aby to zrobić, ustaw atrybut
map:ambientEnabled="true"
w pliku układu XML aktywności lub ustaw go programowo, ustawiającGoogleMapOptions.ambientEnabled(true)
. To ustawienie informuje interfejs API, że musi wstępnie wczytywać niezbędne kafelki mapy dla: w trybie nieaktywnym. - Gdy aktywność przełączy się na tryb nieaktywny, system wywoła metodę
onEnterAmbient()
wAmbientCallback
, którą podasz. ZastąponEnterAmbient()
i wywołajSupportMapFragment.onEnterAmbient(ambientDetails)
lubMapView.onEnterAmbient(ambientDetails)
. Interfejs API jest zastępowany nieinteraktywne, małokolorowe renderowanie mapy. - Podobnie w wywołaniu
onExitAmbient()
SupportMapFragment.onExitAmbient()
lubMapView.onExitAmbient()
. Interfejs API spowoduje przełączenie na normalne renderowanie mapy.
Ten przykładowy kod włącza w aktywności tryb nieaktywny:
Kotlin
class AmbientActivity : AppCompatActivity(), AmbientModeSupport.AmbientCallbackProvider { private lateinit var mapFragment: SupportMapFragment public override fun onCreate(savedState: Bundle?) { super.onCreate(savedState) // Set the layout. It only contains a SupportMapFragment and a DismissOverlay. setContentView(R.layout.activity_main) // Enable ambient support, so the map remains visible in simplified, low-color display // when the user is no longer actively using the app but the app is still visible on the // watch face. val controller = AmbientModeSupport.attach(this) Log.d(AmbientActivity::class.java.simpleName, "Is ambient enabled: " + controller.isAmbient) // Obtain the MapFragment and set the async listener to be notified when the map is ready. mapFragment = supportFragmentManager .findFragmentById(R.id.map) as SupportMapFragment } override fun getAmbientCallback(): AmbientModeSupport.AmbientCallback { return object : AmbientModeSupport.AmbientCallback() { /** * Starts ambient mode on the map. * The API swaps to a non-interactive and low-color rendering of the map when the user is no * longer actively using the app. */ override fun onEnterAmbient(ambientDetails: Bundle) { super.onEnterAmbient(ambientDetails) mapFragment.onEnterAmbient(ambientDetails) } /** * Exits ambient mode on the map. * The API swaps to the normal rendering of the map when the user starts actively using the app. */ override fun onExitAmbient() { super.onExitAmbient() mapFragment.onExitAmbient() } } } }
Java
public class AmbientActivity extends AppCompatActivity implements AmbientModeSupport.AmbientCallbackProvider { private SupportMapFragment mapFragment; public void onCreate(Bundle savedState) { super.onCreate(savedState); // Set the layout. It only contains a SupportMapFragment and a DismissOverlay. setContentView(R.layout.activity_main); // Enable ambient support, so the map remains visible in simplified, low-color display // when the user is no longer actively using the app but the app is still visible on the // watch face. AmbientModeSupport.AmbientController controller = AmbientModeSupport.attach(this); Log.d(AmbientActivity.class.getSimpleName(), "Is ambient enabled: " + controller.isAmbient()); // Obtain the MapFragment and set the async listener to be notified when the map is ready. mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); } @Override public AmbientCallback getAmbientCallback() { return new AmbientCallback() { /** * Starts ambient mode on the map. * The API swaps to a non-interactive and low-color rendering of the map when the user is no * longer actively using the app. */ @Override public void onEnterAmbient(Bundle ambientDetails) { super.onEnterAmbient(ambientDetails); mapFragment.onEnterAmbient(ambientDetails); } /** * Exits ambient mode on the map. * The API swaps to the normal rendering of the map when the user starts actively using the app. */ @Override public void onExitAmbient() { super.onExitAmbient(); mapFragment.onExitAmbient(); } }; } }
Możesz zaktualizować ekran, gdy aplikacja jest w trybie nieaktywnym. Więcej informacji o aktualizowaniu treści i o trybie nieaktywnym znajdziesz w na temat tego, jak zadbać o widoczność aplikacji.
Korzystanie ze Street View na Wear OS
Street View jest w pełni obsługiwane na urządzeniach do noszenia.
Aby użytkownicy mogli wyjść z aplikacji podczas oglądania panoramy Street View, użyj przycisku
StreetViewPanorama.OnStreetViewPanoramaLongClickListener
aby nasłuchiwać gestu długiego kliknięcia. Gdy użytkownik kliknie i przytrzyma w jakimś miejscu obraz w Street View, otrzymasz zdarzenie onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation)
. Wybierz DismissOverlayView.show()
, aby wyświetlić przycisk wyjścia.
Przykładowy kod
Na GitHub jest dostępna aplikacja próbna, której możesz użyć jako punktu wyjścia do stworzenia własnej aplikacji. Przykład pokazuje, jak skonfigurować podstawowe Mapy Google na Wear OS.
Obsługiwane funkcje interfejsu API Map Google na Wear OS
W tej sekcji omawiamy różnice w obsługiwanych funkcjach map na urządzeń do noszenia w porównaniu z urządzeniami ręcznymi (telefonami i tabletami). Wszystkie funkcje interfejsu API, które nie są wymienione poniżej, powinny działać zgodnie z dokumentacją pełnego interfejsu API.
Funkcjonalność | |
---|---|
Tryb w pełni interaktywny i wersja uproszczona | Możesz używać pakietu Maps SDK na Androida w trybie pełnej interakcji lub w wersji uproszczonej. Rozważ użycie trybu lite, jeśli chcesz zoptymalizować działanie na urządzeniu do noszenia, a Twoja aplikacja nie musi obsługiwać interakcji takich jak gesty czy przesuwanie i powiększanie mapy. W trybie uproszczonym intencja uruchomienia aplikacji mobilnej Mapy Google po użytkownik klika mapę, jest wyłączony i nie można go włączyć na urządzenia do noszenia. Pełną listę różnic między trybem uproszczonym a trybem w pełni interaktywnym znajdziesz w dokumentacji dotyczącej trybu trybu uproszczonego. |
Pasek narzędzi mapy | Pasek narzędzi mapy jest wyłączony i nie można go włączyć na urządzeniu do noszenia. |
Elementy sterujące interfejsu | Opcje interfejsu użytkownika są domyślnie wyłączone na urządzeniach do noszenia. Dotyczy to elementów sterujących powiększeniem, kompasem i moją lokalizacją. Możesz je włączyć, korzystając z klasy UiSettings jak zwykle.
|
Gesty | Pojedynczy dotyk gestów działać zgodnie z oczekiwaniami. Przykłady: dotknij i przeciągnij, aby przesuwać mapę, kliknij dwukrotnie, aby powiększyć, i kliknij 2 palcami, aby pomniejszyć. Obsługa gestów wielodotykowych zależy od urządzenia użytkownika. Przykłady gestów wielodotykowych to na przykład pochylanie mapy za pomocą 2 palców, powiększanie przez ściśnięcie palców i obrót za pomocą 2 palców. |
Mapy obiektów i budynki |
Mapy wnętrz są
domyślnie wyłączone na urządzeniu do noszenia. Aby je włączyć, zadzwoń do
GoogleMap.setIndoorEnabled(true) Jeśli mapy obiektów są
włączone, mapa pokaże domyślny poziom piętra.
Poziom
selektora. Element interfejsu nie jest obsługiwany na urządzeniach do noszenia. |
Nakładki z kafelkami | Nakładki na kafelki nie są obsługiwane na urządzeniach do noszenia. |
Sprawdzone metody tworzenia aplikacji za pomocą interfejsu API Map Google na Wear OS
Jak zadbać o wygodę użytkowników aplikacji:
- Mapa powinna zajmować dużą część ekranu. Jest to konieczne, aby zoptymalizować użyteczność mapy na małym urządzeniu do noszenia.
- Podczas projektowania interfejsu aplikacji weź pod uwagę fakt, że urządzenie do noszenia ma słabą baterię. Utrzymywanie aktywnego ekranu wyświetlenie mapy wpłynie na zużycie baterii.