Khi sử dụng Maps SDK cho Android, bạn có thể tạo một ứng dụng cho thiết bị đeo dựa trên bản đồ chạy trực tiếp trên các thiết bị Wear OS by Google. Người dùng ứng dụng của bạn có thể xem vị trí của họ trên bản đồ chỉ bằng cách liếc nhìn cổ tay. Ví dụ: họ có thể vẽ vị trí của mình trên một tuyến đường, sau đó phóng to để xem chi tiết hoặc nhấn vào một điểm đánh dấu để xem cửa sổ thông tin do ứng dụng của bạn cung cấp.
Trang này mô tả chức năng API có trên thiết bị đeo và giúp bạn bắt đầu xây dựng ứng dụng.
Bắt đầu sử dụng Wear OS
Về cơ bản, việc xây dựng ứng dụng cho thiết bị đeo bằng Maps SDK cho Android cũng giống như việc xây dựng ứng dụng Google Maps cho mọi thiết bị Android khác. Điểm khác biệt nằm ở thiết kế của bạn cho kiểu dáng nhỏ hơn của thiết bị đeo được, nhằm tối ưu hoá khả năng sử dụng và hiệu suất của ứng dụng.
Android Studio là công cụ được đề xuất để phát triển Wear OS, vì công cụ này hỗ trợ thiết lập dự án, bao gồm thư viện và đóng gói tiện lợi.
Để được trợ giúp chung về cách thiết kế ứng dụng cho thiết bị đeo, hãy tham khảo Nguyên tắc thiết kế Wear OS. Để được trợ giúp về cách tạo ứng dụng cho thiết bị đeo đầu tiên, hãy xem hướng dẫn tạo ứng dụng cho thiết bị đeo.
Xây dựng ứng dụng bản đồ đầu tiên trên Wear OS
Hướng dẫn nhanh này giả định rằng bạn đã quen thuộc với Maps SDK cho Android, đã làm theo hướng dẫn về Wear OS để tạo mô-đun đeo được trong ứng dụng và hiện muốn thêm bản đồ vào mô-đun đeo được.
Thêm phần phụ thuộc cho mô-đun đeo được
Đảm bảo rằng các phần phụ thuộc sau đây được đưa vào tệp build.gradle.kts của mô-đun Wear OS trong ứng dụng:
dependencies { // ... // Modern Android projects use version catalogs to manage dependencies. To include the necessary dependencies, // first add the following to your libs.versions.toml file: // // [versions] // playServicesMaps = "20.0.0" // wear = "1.3.0" // wearable = "2.9.0" // // [libraries] // play-services-maps = { group = "com.google.android.gms", name = "play-services-maps", version.ref = "playServicesMaps" } // wear = { group = "androidx.wear", name = "wear", version.ref = "wear" } // wearable-compile = { group = "com.google.android.wearable", name = "wearable", version.ref = "wearable" } // wearable-support = { group = "com.google.android.support", name = "wearable", version.ref = "wearable" } compileOnly(libs.wearable.compile) implementation(libs.wearable.support) implementation(libs.play.services.maps) // This dependency is necessary for ambient mode implementation(libs.wear) // Android Test Dependencies androidTestImplementation(libs.ext.junit) androidTestImplementation(libs.espresso.core) androidTestImplementation(libs.uiautomator) androidTestImplementation(libs.truth) androidTestImplementation(libs.junit) // If your project does not use a version catalog, you can use the following dependencies instead: // // 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:20.0.0") // implementation("androidx.wear:wear:1.3.0") // androidTestImplementation("androidx.test.ext:junit:1.1.5") // androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") // androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0") // androidTestImplementation("com.google.truth:truth:1.4.2") // androidTestImplementation("junit:junit:4.13.2") }
Để biết thêm thông tin về các phần phụ thuộc, hãy xem hướng dẫn Thêm mô-đun Wear OS vào dự án hiện có.
Triển khai cử chỉ vuốt để đóng và đặt màu nền ban đầu
Bạn nên sử dụng SwipeDismissFrameLayout để hiển thị bản đồ trên thiết bị đeo được. Khi sử dụng lớp SwipeDismissFrameLayout, bạn có thể
triển khai cử chỉ vuốt để đóng, giúp người dùng có
cách thoát khỏi ứng dụng bằng cách vuốt từ cạnh ngoài cùng bên trái của màn hình.
Để đặt màu nền ban đầu tuỳ chỉnh, hãy sử dụng thuộc tính XML map:backgroundColor để xác định màu cần hiển thị cho đến khi tải các ô bản đồ thực tế.
Thêm các phần tử SwipeDismissFrameLayout và backgroundColor vào định nghĩa bố cục làm vùng chứa của 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>Khi bạn nhận được đối tượng SwipeDismissFrameLayout trong hoạt động của mình, hãy thêm lệnh gọi lại và đặt hành vi của lệnh gọi lại để thực hiện hành động đóng cần thiết như minh hoạ bên dưới:
Kotlin
class MainActivity : AppCompatActivity(), OnMapReadyCallback, AmbientModeSupport.AmbientCallbackProvider { public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 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); } // ... }
Thêm bản đồ
Sử dụng phương thức gọi lại onMapReady(GoogleMap) như bình thường,
để lấy một đối tượng GoogleMap. Lệnh gọi lại sẽ được kích hoạt khi bản đồ đã sẵn sàng để sử dụng. Trong phương thức gọi lại, bạn có thể thêm điểm đánh dấu hoặc đường nhiều đoạn vào bản đồ, thêm trình nghe hoặc di chuyển máy ảnh. Ví dụ bên dưới thêm một điểm đánh dấu gần Nhà hát Opera 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)); }
Bật chế độ môi trường xung quanh
Maps SDK cho Android hỗ trợ chế độ môi trường xung quanh cho các ứng dụng đeo được. Các ứng dụng hỗ trợ chế độ môi trường xung quanh đôi khi được gọi là ứng dụng luôn bật. Chế độ môi trường xung quanh được kích hoạt khi người dùng không còn tích cực sử dụng ứng dụng và cho phép ứng dụng vẫn hiển thị trên thiết bị đeo được.
Maps SDK cho Android cung cấp bản kết xuất đơn giản, ít màu của bản đồ để sử dụng ở chế độ môi trường xung quanh và kiểu bản đồ sẽ tự động điều chỉnh khi thiết bị chuyển từ chế độ tương tác sang chế độ môi trường xung quanh. Tất cả điểm đánh dấu, đối tượng và thành phần điều khiển trên giao diện người dùng đều biến mất ở chế độ môi trường xung quanh. Điều này giúp giảm mức tiêu thụ điện của ứng dụng và đảm bảo giao diện nhất quán với các ứng dụng môi trường xung quanh khác, chẳng hạn như mặt đồng hồ.
Hãy làm theo các bước sau để đảm bảo ứng dụng của bạn sử dụng chế độ môi trường xung quanh của bản đồ:
- Cập nhật SDK Android để đưa nền tảng Android 6.0 (API 23) trở lên vào. Nền tảng này cung cấp các API cho phép Hoạt động chuyển sang chế độ môi trường xung quanh. Để biết thông tin về cách cập nhật SDK, hãy xem tài liệu Android về cách thêm gói SDK.
- Đảm bảo dự án của bạn nhắm đến Android 6.0 trở lên bằng cách đặt
targetSdkVersionthành 23 trở lên trong tệp kê khai ứng dụng. - Thêm các phần phụ thuộc đeo được vào tệp
build.gradle.ktscủa ứng dụng. Xem mẫu trên trang này. - Thêm mục thư viện dùng chung cho thiết bị đeo vào tệp kê khai ứng dụng cho thiết bị đeo, như mô tả trong lớp học đào tạo về Android về cách duy trì sự xuất hiện của ứng dụng.
- Thêm quyền
WAKE_LOCKvào tệp kê khai ứng dụng cầm tay và ứng dụng cho thiết bị đeo, như mô tả trong lớp học đào tạo về Android về cách duy trì sự xuất hiện của ứng dụng. - Trong phương thức
onCreate()của hoạt động, hãy gọi phương thứcAmbientModeSupport.attach(). Phương thức này cho hệ điều hành biết rằng ứng dụng luôn bật, để khi thiết bị tắt nguồn, ứng dụng sẽ chuyển sang chế độ môi trường xung quanh thay vì quay lại mặt đồng hồ. - Triển khai giao diện
AmbientModeSupport.AmbientCallbackProvidertrong Hoạt động để giao diện này có thể nhận các thay đổi về trạng thái chế độ môi trường xung quanh. - Đặt bản đồ của bạn để hỗ trợ chế độ môi trường xung quanh. Bạn có thể thực hiện việc này bằng cách đặt
thuộc tính
map:ambientEnabled="true"trong tệp bố cục XML của hoạt động hoặc thực hiện theo phương thức lập trình bằng cách đặtGoogleMapOptions.ambientEnabled(true). Chế độ cài đặt này thông báo cho API rằng API phải tải trước các ô bản đồ cần thiết để sử dụng ở chế độ môi trường xung quanh. - Khi hoạt động chuyển sang chế độ môi trường xung quanh, hệ thống sẽ gọi phương thức
onEnterAmbient()trongAmbientCallbackmà bạn cung cấp. Ghi đèonEnterAmbient()và gọiSupportMapFragment.onEnterAmbient(ambientDetails)hoặcMapView.onEnterAmbient(ambientDetails). API sẽ chuyển sang bản kết xuất không tương tác và ít màu của bản đồ. - Tương tự, trong
onExitAmbient()hãy gọiSupportMapFragment.onExitAmbient()hoặcMapView.onExitAmbient(). API sẽ chuyển sang bản kết xuất bình thường của bản đồ.
Mã mẫu sau đây bật chế độ môi trường xung quanh trong hoạt động:
Kotlin
class AmbientActivity : AppCompatActivity(), AmbientModeSupport.AmbientCallbackProvider { private lateinit var mapFragment: SupportMapFragment public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 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(); } }; } }
Bạn có thể cập nhật màn hình khi ứng dụng ở chế độ môi trường xung quanh. Để biết thêm thông tin chi tiết về cách cập nhật nội dung và về chế độ môi trường xung quanh nói chung, hãy xem lớp học đào tạo về Android về cách duy trì sự xuất hiện của ứng dụng.
Sử dụng Chế độ xem đường phố trên Wear OS
Chế độ xem đường phố được hỗ trợ đầy đủ trên các thiết bị đeo được.
Để cho phép người dùng thoát khỏi ứng dụng khi xem ảnh toàn cảnh trong Chế độ xem phố, hãy sử dụng giao diện
StreetViewPanorama.OnStreetViewPanoramaLongClickListener
để nghe cử chỉ nhấp và giữ. Khi người dùng nhấp và giữ ở đâu đó trên hình ảnh Chế độ xem phố, bạn sẽ nhận được sự kiện onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation). Gọi DismissOverlayView.show() để hiển thị nút thoát.
Mã mẫu
Một ứng dụng mẫu có trên GitHub mà bạn có thể dùng làm điểm xuất phát cho ứng dụng của mình. Mẫu này cho bạn thấy cách thiết lập Bản đồ Google cơ bản trên Wear OS.
Chức năng được hỗ trợ trong Maps API trên Wear OS
Phần này trình bày những điểm khác biệt về chức năng được hỗ trợ cho bản đồ trên các thiết bị đeo được so với thiết bị cầm tay (điện thoại và máy tính bảng). Tất cả các tính năng API không được đề cập bên dưới sẽ hoạt động như trong tài liệu cho toàn bộ API.
| Chức năng | |
|---|---|
| Chế độ tương tác đầy đủ và chế độ thu gọn | Bạn có thể sử dụng Maps SDK cho Android ở chế độ tương tác đầy đủ hoặc ở chế độ thu gọn. Hãy cân nhắc chế độ thu gọn nếu bạn muốn tối ưu hoá hiệu suất trên thiết bị đeo được và ứng dụng của bạn không cần hỗ trợ tương tác như cử chỉ hoặc kéo và thu phóng bản đồ. Ở chế độ thu gọn, ý định khởi động ứng dụng di động Google Maps khi người dùng nhấn vào bản đồ sẽ bị tắt và không thể bật trên thiết bị đeo được. Để xem danh sách đầy đủ các điểm khác biệt giữa chế độ thu gọn và chế độ tương tác đầy đủ, hãy xem tài liệu về chế độ thu gọn. |
| Thanh công cụ bản đồ | Thanh công cụ bản đồ bị tắt và không thể bật trên thiết bị đeo được. |
| Thành phần điều khiển trên giao diện người dùng | Theo mặc định, các thành phần điều khiển trên giao diện người dùng UI
sẽ bị tắt trên các thiết bị đeo được. Các thành phần này bao gồm
thành phần điều khiển thu phóng, la bàn và vị trí của tôi. Bạn có thể bật các thành phần này bằng lớp
UiSettings
như bình thường.
|
| Cử chỉ | Cử chỉ một lần chạm hoạt động như mong đợi. Ví dụ: chạm và kéo để di chuyển bản đồ, nhấn đúp để phóng to và nhấn bằng 2 ngón tay để thu nhỏ. Mức hỗ trợ cho cử chỉ đa điểm sẽ khác nhau tuỳ theo thiết bị của người dùng. Ví dụ về cử chỉ đa điểm bao gồm đẩy bằng 2 ngón tay để nghiêng bản đồ, chụm để thu phóng và xoay bằng 2 ngón tay. |
| Bản đồ trong nhà và toà nhà |
Theo mặc định, bản đồ trong nhà sẽ
bị tắt trên thiết bị đeo được. Bạn có thể bật các bản đồ này bằng cách gọi
GoogleMap.setIndoorEnabled(true). Nếu bản đồ trong nhà được
bật, bản đồ sẽ hiển thị tầng mặc định.
Phần tử trên giao diện người dùng chọn tầng không được hỗ trợ trên các thiết bị đeo được. |
| Lớp phủ ô | Lớp phủ ô không được hỗ trợ trên các thiết bị đeo được. |
Các phương pháp hay nhất để phát triển bằng Maps API trên Wear OS
Cách mang lại trải nghiệm tốt nhất cho người dùng trong ứng dụng của bạn:
- Bản đồ phải chiếm một phần lớn màn hình. Điều này là cần thiết để tối ưu hoá khả năng sử dụng bản đồ trên kiểu dáng nhỏ của thiết bị đeo được.
- Khi thiết kế trải nghiệm người dùng của ứng dụng, hãy lưu ý đến việc thiết bị đeo được có pin yếu. Việc duy trì màn hình hoạt động và bản đồ hiển thị sẽ ảnh hưởng đến hiệu suất pin.