API Maps trên Wear OS

Bản đồ trên thiết bị đeo

Khi sử dụng SDK Maps 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 của 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 thông tin 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ị Wear và giúp bạn bắt đầu xây dựng ứng dụng.

Bắt đầu trên Wear OS

Về cơ bản, việc xây dựng ứng dụng cho thiết bị đeo bằng SDK Bản đồ dành 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 hệ số hình dạng nhỏ hơn của thiết bị đeo, nhằm tối ưu hoá khả năng hữu 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ì phần mềm 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 đầu tiên dành cho thiết bị đeo, hãy xem hướng dẫn tạo ứng dụng dành 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 SDK Maps cho Android, bạn đã làm theo hướng dẫn về Wear OS để tạo mô-đun thiết bị đeo trong ứng dụng và giờ đây, bạn muốn thêm bản đồ vào mô-đun thiết bị đeo.

Thêm phần phụ thuộc cho mô-đun Wear

Đảm bảo rằng các phần phụ thuộc sau đây có trong tệp build.gradle.kts của mô-đun Wear OS trong ứng dụng:

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")
}

Để 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. Khi sử dụng lớp SwipeDismissFrameLayout, bạn có thể triển khai cử chỉ vuốt để đóng, cho phép người dùng 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 hiển thị cho đến khi các thẻ thông tin trên bản đồ thực tế tải xong.

Thêm các phần tử SwipeDismissFrameLayoutbackgroundColor vào định nghĩa bố cục của bạn dưới dạng 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 lấy đối tượng SwipeDismissFrameLayout trong hoạt động, hãy thêm một lệnh gọi lại và đặt hành vi của lệnh gọi lại để thực hiện thao tác đóng cần thiết như minh hoạ dưới đây:

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);
    }

    // ...
}

      

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 handle cho đối tượng GoogleMap. Lệnh gọi lại đượ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 đa tuyến vào bản đồ, thêm trình nghe hoặc di chuyển máy ảnh. Ví dụ dưới đây 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

SDK Bản đồ dành cho Android hỗ trợ chế độ môi trường xung quanh cho các ứng dụng trên thiết bị đeo. 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 chủ động sử dụng ứng dụng và cho phép ứng dụng vẫn hiển thị trên thiết bị đeo.

SDK Bản đồ dành cho Android cung cấp bản đồ được kết xuất đơn giản, ít màu để sử dụng ở chế độ môi trường xung quanh, đồng thời kiểu bản đồ sẽ tự động điều chỉnh khi thiết bị chuyển đổi 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à các chế độ điều khiển giao diện người dùng sẽ 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 năng 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 đồ:

  1. Cập nhật SDK Android để bao gồm nền tảng Android 6.0 (API 23) trở lên. Nền tảng này cung cấp các API cho phép các 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 của Android về cách thêm gói SDK.
  2. Đảm bảo dự án của bạn nhắm đến Android 6.0 trở lên bằng cách đặt targetSdkVersion thành 23 trở lên trong tệp kê khai ứng dụng.
  3. Thêm các phần phụ thuộc cho thiết bị đeo vào tệp build.gradle.kts của ứng dụng. Xem mẫu trên trang này.
  4. Thêm mục nhập 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 đào tạo Android về cách duy trì sự hiện diện của ứng dụng.
  5. Thêm quyền WAKE_LOCK vào tệp kê khai ứng dụng cầm tay và thiết bị đeo, như mô tả trong lớp đào tạo Android về cách giữ cho ứng dụng của bạn hiển thị.
  6. Trong phương thức onCreate() của hoạt động, hãy gọi phương thức AmbientModeSupport.attach(). Điều này cho hệ điều hành biết rằng ứng dụng luôn bật, vì vậy 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ồ.
  7. Triển khai giao diện AmbientModeSupport.AmbientCallbackProvider trong Hoạt động để có thể nhận các thay đổi trạng thái của chế độ môi trường xung quanh.
  8. Đặ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 việc này theo phương thức lập trình bằng cách đặt GoogleMapOptions.ambientEnabled(true). Chế độ cài đặt này cho API biết rằng API phải tải trước các thẻ thông tin cần thiết trên bản đồ để sử dụng trong chế độ môi trường xung quanh.
  9. 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() trong AmbientCallback mà bạn cung cấp. Ghi đè onEnterAmbient() và gọi SupportMapFragment.onEnterAmbient(ambientDetails) hoặc MapView.onEnterAmbient(ambientDetails). API sẽ hoán đổi sang chế độ kết xuất bản đồ không tương tác và có màu sắc thấp.
  10. Tương tự, trong onExitAmbient(), hãy gọi SupportMapFragment.onExitAmbient() hoặc MapView.onExitAmbient(). API sẽ hoán đổi sang chế độ kết xuất thông 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(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();
            }
        };
    }
}

      

Bạn có thể cập nhật màn hình trong khi ứng dụng ở chế độ môi trường xung quanh. Để biết thêm thông tin chi tiết về việc cập nhật nội dung và nói chung về chế độ môi trường xung quanh, hãy xem lớp đào tạo của 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.

Để cho phép người dùng thoát khỏi ứng dụng khi xem ảnh toàn cảnh trên Chế độ xem đường 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ữ vào một vị trí trên hình ảnh Chế độ xem đường phố, bạn sẽ nhận được một sự kiện onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation). Gọi DismissOverlayView.show() để hiển thị nút thoát.

Mã mẫu

Bạn có thể sử dụng ứng dụng mẫu trên GitHub làm điểm xuất phát cho ứng dụng của mình. Mẫu này cho bạn biết cách thiết lập Google Maps cơ bản trên Wear OS.

Chức năng được hỗ trợ trong API Maps trên Wear OS

Phần này trình bày sự khác biệt về chức năng được hỗ trợ cho bản đồ trên thiết bị đeo 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ư được ghi nhận cho API đầy đủ.

Chức năng
Chế độ tương tác đầy đủ và chế độ lite

Bạn có thể sử dụng SDK Bản đồ dành cho Android ở chế độ tương tác đầy đủ hoặc ở chế độ rút gọn. Hãy cân nhắc sử dụng chế độ lite nếu bạn muốn tối ưu hoá hiệu suất trên thiết bị đeo 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ế độ Lite, ý định khởi động ứng dụng Google Maps dành cho thiết bị di động 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.

Để biết danh sách đầy đủ các điểm khác biệt giữa chế độ lite và chế độ tương tác đầy đủ, hãy xem tài liệu về chế độ lite.

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.
Thành phần điều khiển trên giao diện người dùng Các chế độ điều khiển giao diện người dùng bị tắt theo mặc định trên thiết bị đeo. Điều này bao gồm các chế độ đ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 tính năng này bằng cách sử dụng lớp UiSettings như bình thường.
Cử chỉ Cử chỉ nhấn một lần 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 hai ngón tay để thu nhỏ. Khả năng hỗ trợ cử chỉ cảm ứng đa điểm sẽ khác nhau tuỳ theo thiết bị của người dùng. Ví dụ về cử chỉ cảm ứng đa điểm bao gồm đẩy bằng hai ngón tay để nghiêng bản đồ, chụm để thu phóng và xoay bằng hai 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. Bạn có thể bật các thông báo này bằng cách gọi GoogleMap.setIndoorEnabled(true). Nếu bạn bật bản đồ trong nhà, bản đồ sẽ hiển thị tầng mặc định. Thành phần giao diện người dùng bộ chọn cấp độ không được hỗ trợ trên thiết bị đeo.
Lớp phủ ô Lớp phủ Thẻ thông tin không được hỗ trợ trên thiết bị đeo.

Các phương pháp hay nhất để phát triển bằng API Maps 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:

  • Bản đồ phải chiếm phần lớn màn hình. Điều này là cần thiết để tối ưu hoá khả năng hữu dụng của bản đồ trên thiết bị đeo có kích thước nhỏ.
  • Khi thiết kế trải nghiệm người dùng cho ứng dụng, hãy cân nhắc thực tế rằng thiết bị đeo có pin yếu. Việc luôn bật màn hình và hiển thị bản đồ sẽ ảnh hưởng đến hiệu suất pin.