API Maps trên Wear OS

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

Bằng cách sử dụng SDK bản đồ dành cho Android, bạn có thể tạo ứng dụng cho thiết bị đeo dựa trên bản đồ chạy trực tiếp trên 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 nhìn vào cổ tay của họ. Chúng có thể vẽ vị trí của chúng trên một tuyến đường, ví dụ: sau đó phóng to để biết chi tiết hoặc nhấn vào đ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 của mình.

Bắt đầu trên Wear OS

Việc tạo một ứng dụng cho thiết bị đeo bằng SDK Maps dành cho Android về cơ bản là giống như tạo ứng dụng Google Maps cho bất kỳ thiết bị Android nào khác. Điểm khác biệt nằm trong thiết kế của bạn cho kiểu dáng nhỏ hơn của thiết bị đeo, để tối ưu hoá hiệu suất và khả năng hữu dụng của ứng dụng.

Android Studio là công cụ bạn nên dùng để phát triển Wear OS, vì tính năng này giúp thiết lập dự án, đưa thư viện vào và đóng gói tiện lợi.

Để được trợ giúp chung về việc thiết kế ứng dụng cho thiết bị đeo, hãy tham khảo Nguyên tắc thiết kế cho Wear OS. Để được trợ giúp tạo đầu tiên cho thiết bị đeo, hãy xem hướng dẫn về cách 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 SDK bản đồ dành cho Android, mà bạn đã làm theo hướng dẫn dành cho Wear OS để tạo một mô-đun cho thiết bị đeo ứng dụng của bạn và giờ đây bạn muốn thêm bản đồ vào mô-đun thiết bị đeo.

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

Hãy đảm bảo rằng các phần phụ thuộc sau đây đã có trong tệp build.gradle của mô-đun Wear OS của ứ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 này, hãy xem hướng dẫn Thêm phần phụ thuộc Mô-đun Wear OS trong dự án hiện tại của bạn.

Triển khai cử chỉ vuốt để bỏ qua 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 để bỏ qua để cung cấp cho người dùng để thoát khỏi ứng dụng bằng cách vuốt từ mép 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 XML map:backgroundColor để xác định màu sẽ hiển thị cho đến khi các ô bản đồ thực tế tải.

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

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ư thường lệ, để xử lý đối tượng GoogleMap. Lệnh gọi lại là đượ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 hình nhiều đường vào bản đồ, thêm trình nghe hoặc di chuyển máy ảnh. Chiến lược phát hành đĩa đơn ví dụ dưới đây sẽ 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 dành cho thiết bị đeo của chúng tôi. 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 sử dụng ứng dụng, và cho phép ứng dụng hiển thị trên thiết bị đeo.

SDK bản đồ dành cho Android cung cấp tính năng hiển thị đơn giản, ít màu sắc của bản đồ để sử dụng trong chế độ môi trường xung quanh và kiểu bản đồ 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à giao diện người dùng các nút điều khiển sẽ biến mất ở chế độ môi trường xung quanh. Điều này làm giảm mức tiêu thụ điện năng của và đảm bảo giao diện nhất quán với các ứng dụng khác theo môi trường xung quanh, chẳng hạn như mặt đồng hồ.

Hãy làm theo các bước sau đây để đả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 phiên bản Android 6.0 (API 23) trở lên nền tảng cung cấp các API cho phép hoạt động chuyển sang 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.
  2. Hãy đả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 của thiết bị đeo vào tệp build.gradle của ứng dụng. Xem mẫu trên trang này.
  4. Thêm mục nhập thư viện chia sẻ trên thiết bị đeo vào tệp kê khai ứng dụng cho thiết bị đeo, dưới dạng được mô tả trong lớp đào tạo về Android về giúp ứng dụng luôn hiển thị.
  5. Thêm quyền WAKE_LOCK vào tệp kê khai ứng dụng cho thiết bị đeo và thiết bị cầm tay, như được mô tả trong lớp đào tạo về Android về giúp ứng dụng luô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 biết hệ điều hành mà ứng dụng sẽ luôn bật để khi thiết bị tắt nguồn, đồng hồ sẽ chuyển sang chế độ môi trường xung quanh thay vì quay lại đồng hồ khuôn mặt.
  7. Triển khai giao diện AmbientModeSupport.AmbientCallbackProvider trong Hoạt động để có thể nhận được các thay đổi về trạng thái 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 theo phương thức lập trình bằng cách đặt GoogleMapOptions.ambientEnabled(true). Chế độ cài đặt này thông báo cho API biết rằng nó phải tải trước các ô bản đồ cần thiết cho sử dụng ở 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() rồi gọi SupportMapFragment.onEnterAmbient(ambientDetails) hoặc MapView.onEnterAmbient(ambientDetails). API chuyển thành kết xuất bản đồ không mang tính tương tác và ít màu sắc.
  10. Tương tự, trong lệnh gọi onExitAmbient() SupportMapFragment.onExitAmbient() hoặc MapView.onExitAmbient(). API hoán đổi sang 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 khi ứng dụng ở chế độ môi trường xung quanh. Để biết thêm thông tin 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 đào tạo về cách giúp ứng dụng của bạn luôn hiển thị.

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 trong Chế độ xem đường phố, hãy sử dụng StreetViewPanorama.OnStreetViewPanoramaLongClickListener để theo dõi cử chỉ nhấp và giữ. Khi người dùng nhấp và giữ chuột vào một vị trí nào đó trên hình ảnh Chế độ xem phố, bạn sẽ nhận được Sự kiện onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation). Gọi điện DismissOverlayView.show() để cho thấy nút thoát.

Mã mẫu

Hiện có ứng dụng mẫu trên GitHub, bạn có thể sử dụng ứng dụng này làm điểm khởi đầu cho ứng dụng của mình. Mẫu này cho bạn biết cách thiết lập Google Map 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 khi so sánh với thiết bị cầm tay (điện thoại và máy tính bảng). Tất cả tính năng API không được đề cập bên dưới đều phải hoạt động như được nêu trong tài liệu của API đầy đủ.

Chức năng
Chế độ tương tác hoàn toàn và chế độ thu gọn

Bạn có thể sử dụng SDK bản đồ dành cho Android ở chế độ tương tác hoàn toàn hoặc ở chế độ lite. 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 và ứng dụng của bạn không cần hỗ trợ tương tác như cử chỉ hoặc xoay và thu phóng bản đồ.

Ở chế độ thu gọn, ý định khởi động ứng dụng dành cho thiết bị 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 được trên một thiết bị có thể đeo.

Để 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 đủ chế độ thu gọn, xem chế độ lite .

Thanh công cụ của bản đồ Bản đồ thanh công cụ bị tắt và không thể bật được trên thiết bị đeo của bạn.
Thành phần điều khiển trên giao diện người dùng Giao diện người dùng các nút điều khiển bị tắt theo mặc định trên các thiết bị đeo. bao gồm thu phóng, la bàn và các điều khiển vị trí của tôi. Bạn có thể bật chúng bằng cách sử dụng UiSettings lớp học như bình thường.
Cử chỉ Một lần chạm cử chỉ hoạt động như dự kiến. Ví dụ như chạm và kéo để xoay 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ỉ nhiều điểm chạm sẽ khác nhau tuỳ thuộc vào thiết bị của người dùng. Ví dụ về cử chỉ nhiều điểm chạ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 đồ và toà nhà trong nhà Bản đồ trong nhà tắt theo mặc định trên thiết bị đeo. Bạn có thể bật chúng bằng cách gọi GoogleMap.setIndoorEnabled(true). Nếu bản đồ trong nhà là bật, bản đồ sẽ hiển thị tầng sàn mặc định. Cấp độ bộ chọn không được hỗ trợ trên các thiết bị đeo.
Lớp phủ ô Lớp phủ ô 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 cung cấp trải nghiệm người dùng tốt nhất trong ứng dụng của bạn:

  • Bản đồ phải chiếm tỷ lệ lớn trê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 đồ đối với kiểu dáng nhỏ nhắn của thiết bị đeo thiết bị.
  • Khi thiết kế trải nghiệm người dùng trong ứng dụng, hãy tính đến thực tế rằng thiết bị đeo có pin yếu. Duy trì hoạt động của màn hình và bản đồ mà bạn nhìn thấy sẽ ảnh hưởng đến hiệu suất pin.