Maps API บน Wear OS

แผนที่ในอุปกรณ์ที่สวมใส่ได้

เมื่อใช้ Maps SDK สําหรับ Android คุณสามารถสร้างแอปที่สวมใส่ได้ซึ่งอิงตามแผนที่และทํางานในอุปกรณ์ Wear OS by Google ได้โดยตรง ผู้ใช้แอปของคุณจะดูตำแหน่งของตนบนแผนที่ได้ง่ายๆ เพียงมองไปที่ข้อมือ ผู้ใช้สามารถวางตำแหน่งของตนบนเส้นทาง จากนั้นซูมเข้าเพื่อดูรายละเอียด หรือแตะเครื่องหมายเพื่อดูหน้าต่างข้อมูลที่แอปของคุณให้ไว้

หน้านี้อธิบายฟังก์ชันการทำงานของ API ที่มีอยู่ในอุปกรณ์ Wear และช่วยคุณเริ่มต้นสร้างแอป

การเริ่มต้นใช้งานใน Wear OS

การสร้างแอปสำหรับอุปกรณ์ที่สวมใส่ได้ด้วย Maps SDK สำหรับ Android นั้นโดยพื้นฐานแล้วเหมือนกับการสร้างแอป Google Maps สำหรับอุปกรณ์ Android เครื่องอื่นๆ ความแตกต่างอยู่ที่การออกแบบสำหรับอุปกรณ์ที่สวมใส่ได้ที่มีขนาดเล็กลงเพื่อเพิ่มประสิทธิภาพการใช้งานและประสิทธิภาพของแอป

Android Studio เป็นเครื่องมือที่แนะนำสำหรับการพัฒนา Wear OS เนื่องจากมีการตั้งค่าโปรเจ็กต์ การรวมไลบรารี และการจัดแพ็กเกจที่สะดวก

ดูความช่วยเหลือทั่วไปเกี่ยวกับการออกแบบแอปสำหรับอุปกรณ์ที่สวมใส่ได้ที่หลักเกณฑ์การออกแบบ Wear OS หากต้องการความช่วยเหลือในการสร้างแอปที่สวมใส่ได้แอปแรก โปรดดูคู่มือการสร้างแอปที่สวมใส่ได้

การสร้างแอปแผนที่แอปแรกใน Wear OS

คู่มือฉบับย่อนี้ถือว่าคุณคุ้นเคยกับ Maps SDK สําหรับ Android, คุณได้ทําตามคู่มือ Wear OS เพื่อสร้างโมดูลอุปกรณ์ที่สวมใส่ได้ในแอป และตอนนี้คุณต้องการเพิ่มแผนที่ลงในโมดูลอุปกรณ์ที่สวมใส่ได้

การเพิ่ม Dependency สําหรับโมดูล Wear

ตรวจสอบว่าไฟล์ build.gradle.kts ของโมดูล Wear OS ของแอปมีไลบรารีต่อไปนี้

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อกําหนดเบื้องต้นได้ในคู่มือเพิ่มข้อบังคับของ Wear OS ในโปรเจ็กต์ที่มีอยู่

การใช้ท่าทางสัมผัสปัดเพื่อปิดและตั้งค่าสีพื้นหลังเริ่มต้น

เราขอแนะนำให้คุณใช้ SwipeDismissFrameLayout เพื่อแสดงแผนที่บนอุปกรณ์ที่สวมใส่ได้ เมื่อใช้คลาส SwipeDismissFrameLayout คุณจะสามารถใช้ท่าทางสัมผัสปัดเพื่อปิดเพื่อให้ผู้ใช้มีวิธีออกจากแอปด้วยการปัดจากขอบด้านซ้ายสุดของหน้าจอ

หากต้องการกำหนดสีพื้นหลังเริ่มต้นที่กำหนดเอง ให้ใช้แอตทริบิวต์ map:backgroundColor XML เพื่อกำหนดสีที่จะแสดงจนกว่าระบบจะโหลดไทล์แผนที่จริง

เพิ่มองค์ประกอบ SwipeDismissFrameLayout และ backgroundColor ลงในการกำหนดค่าเลย์เอาต์เป็นคอนเทนเนอร์ของ 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>

เมื่อได้รับออบเจ็กต์ SwipeDismissFrameLayout ในกิจกรรม ให้เพิ่มการเรียกกลับและตั้งค่าลักษณะการทํางานของการเรียกกลับเพื่อดําเนินการปิดที่จำเป็นดังที่แสดงด้านล่าง

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

    // ...
}

      

การเพิ่มแผนที่

ใช้เมธอดการเรียกกลับ onMapReady(GoogleMap) ตามปกติเพื่อรับแฮนเดิลของออบเจ็กต์ GoogleMap ระบบจะเรียกใช้การเรียกกลับเมื่อแผนที่พร้อมใช้งาน ในเมธอดการเรียกกลับ คุณสามารถเพิ่มเครื่องหมายหรือเส้นประกอบลงในแผนที่ เพิ่ม Listeners หรือย้ายกล้อง ตัวอย่างด้านล่างแสดงการเพิ่มเครื่องหมายใกล้กับโรงละครโอเปร่าซิดนีย์

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

      

การเปิดใช้โหมดแอมเบียนท์

Maps SDK สําหรับ Android รองรับโหมดแอมเบียนท์สําหรับแอปที่สวมใส่ได้ แอปที่รองรับโหมดแอมเบียนท์บางครั้งเรียกว่าแอปเปิดอยู่เสมอ โหมดแอมเบียนท์จะเปิดใช้งานเมื่อผู้ใช้ไม่ได้ใช้งานแอปอยู่อีกต่อไป และช่วยให้แอปยังคงแสดงอยู่ในอุปกรณ์ที่สวมใส่ได้

Maps SDK สำหรับ Android แสดงผลแผนที่แบบเรียบง่ายที่มีสีน้อยเพื่อใช้ในโหมดแอมเบียนท์ และสไตล์แผนที่จะปรับโดยอัตโนมัติเมื่ออุปกรณ์เปลี่ยนจากโหมดอินเทอร์แอกทีฟเป็นโหมดแอมเบียนท์ เครื่องหมาย วัตถุ และการควบคุม UI ทั้งหมดจะหายไปในโหมดแอมเบียนท์ วิธีนี้ช่วยลดการใช้พลังงานของแอปและช่วยให้รูปลักษณ์ของแอปสอดคล้องกันกับแอปอื่นๆ ที่อยู่ในโหมดแอมเบียนท์ เช่น หน้าปัด

ทำตามขั้นตอนต่อไปนี้เพื่อให้แน่ใจว่าแอปใช้โหมดแอมเบียนท์ของแผนที่

  1. อัปเดต Android SDK ให้รวมแพลตฟอร์ม Android 6.0 (API 23) ขึ้นไป ซึ่งจะมี API ที่อนุญาตให้กิจกรรมเข้าสู่โหมดแอมเบียนท์ ดูข้อมูลเกี่ยวกับวิธีอัปเดต SDK ได้ที่เอกสารประกอบของ Android เกี่ยวกับการเพิ่มแพ็กเกจ SDK
  2. ตรวจสอบว่าโปรเจ็กต์กำหนดเป้าหมายเป็น Android 6.0 ขึ้นไปโดยการตั้งค่า targetSdkVersion เป็น 23 ขึ้นไปใน App Manifest
  3. เพิ่มข้อกำหนดเบื้องต้นของอุปกรณ์ที่สวมใส่ได้ในไฟล์ build.gradle.kts ของแอป ดูตัวอย่างในหน้านี้
  4. เพิ่มรายการไลบรารีที่ใช้ร่วมกันของอุปกรณ์ที่สวมใส่ลงในไฟล์ Manifest ของแอปที่สวมใส่ได้ตามที่อธิบายไว้ในชั้นเรียนการฝึกอบรม Android เกี่ยวกับการทำให้แอปปรากฏอยู่เสมอ
  5. เพิ่มสิทธิ์ WAKE_LOCK ลงในไฟล์ Manifest ของแอปในอุปกรณ์พกพาและอุปกรณ์ที่สวมใส่ได้ ตามที่อธิบายไว้ในชั้นเรียนการฝึกอบรม Android เกี่ยวกับการทำให้แอปปรากฏอยู่เสมอ
  6. ในเมธอด onCreate() ของกิจกรรม ให้เรียกใช้เมธอด AmbientModeSupport.attach() ซึ่งจะบอกระบบปฏิบัติการว่าแอปพลิเคชันเปิดอยู่ตลอดเวลา ดังนั้นเมื่ออุปกรณ์ปิดเครื่อง แอปพลิเคชันควรเข้าสู่โหมดแอมเบียนท์แทนที่จะกลับไปที่หน้าปัด
  7. ใช้อินเทอร์เฟซ AmbientModeSupport.AmbientCallbackProvider ใน Activity เพื่อให้รับการเปลี่ยนแปลงสถานะโหมดแอมเบียนท์ได้
  8. ตั้งค่าแผนที่ให้รองรับโหมดแอมเบียนท์ ซึ่งทำได้โดยการตั้งค่าแอตทริบิวต์ map:ambientEnabled="true" ในไฟล์เลย์เอาต์ XML ของกิจกรรม หรือทำแบบเป็นโปรแกรมโดยการตั้งค่า GoogleMapOptions.ambientEnabled(true) การตั้งค่านี้จะแจ้งให้ API ทราบว่าต้องโหลดข้อมูลแผนที่ที่จำเป็นไว้ล่วงหน้าเพื่อใช้ในโหมดแอมเบียนท์
  9. เมื่อกิจกรรมเปลี่ยนเป็นโหมดแอมเบียนท์ ระบบจะเรียกใช้เมธอด onEnterAmbient() ใน AmbientCallback ที่คุณระบุ ลบล้าง onEnterAmbient() แล้วเรียกใช้ SupportMapFragment.onEnterAmbient(ambientDetails) หรือ MapView.onEnterAmbient(ambientDetails) API จะเปลี่ยนไปใช้การแสดงผลแผนที่แบบไม่อินเทอร์แอกทีฟและสีต่ำ
  10. ในทำนองเดียวกัน ใน onExitAmbient() ให้พูดว่า SupportMapFragment.onExitAmbient() หรือ MapView.onExitAmbient() API จะเปลี่ยนไปใช้การแสดงผลแผนที่ตามปกติ

ตัวอย่างโค้ดต่อไปนี้เปิดใช้โหมดแอมเบียนท์ในกิจกรรม

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

      

คุณอัปเดตหน้าจอได้ขณะที่แอปอยู่ในโหมดแอมเบียนท์ ดูรายละเอียดเพิ่มเติมเกี่ยวกับการอัปเดตเนื้อหาและโหมดแอมเบียนท์โดยทั่วไปได้ที่ชั้นเรียนการฝึกอบรม Android เกี่ยวกับการทำให้แอปปรากฏอยู่เสมอ

การใช้ Street View ใน Wear OS

อุปกรณ์ที่สวมใส่ได้รองรับ Street View อย่างเต็มรูปแบบ

หากต้องการอนุญาตให้ผู้ใช้ออกจากแอปเมื่อดูภาพพาโนรามาของ Street View ให้ใช้อินเทอร์เฟซ StreetViewPanorama.OnStreetViewPanoramaLongClickListener เพื่อรอรับท่าทางสัมผัสการคลิกค้างไว้ เมื่อผู้ใช้คลิกที่ใดที่หนึ่งบนรูปภาพ Street View ค้างไว้ คุณจะได้รับเหตุการณ์ onStreetViewPanoramaLongClick(StreetViewPanoramaOrientation) โทรไปที่ DismissOverlayView.show() เพื่อแสดงปุ่มออก

โค้ดตัวอย่าง

ตัวอย่างแอปมีอยู่ใน GitHub ซึ่งคุณใช้เป็นจุดเริ่มต้นสำหรับแอปได้ ตัวอย่างนี้จะแสดงวิธีตั้งค่า Google Maps พื้นฐานใน Wear OS

ฟังก์ชันการทำงานที่รองรับใน Maps API บน Wear OS

ส่วนนี้จะอธิบายความแตกต่างของฟังก์ชันการทำงานที่รองรับสำหรับแผนที่ในอุปกรณ์ที่สวมใส่ได้เมื่อเทียบกับอุปกรณ์พกพา (โทรศัพท์และแท็บเล็ต) ฟีเจอร์ API ทั้งหมดที่ไม่ได้กล่าวถึงด้านล่างควรทํางานตามที่ระบุไว้ในเอกสารสําหรับ API แบบสมบูรณ์

ฟังก์ชันการทำงาน
โหมดที่โต้ตอบได้อย่างเต็มที่และโหมด Lite

คุณสามารถใช้ Maps SDK สําหรับ Android ในโหมดอินเทอร์แอกทีฟทั้งหมดหรือในโหมด Lite ลองใช้โหมด Lite หากต้องการเพิ่มประสิทธิภาพในอุปกรณ์ที่สวมใส่ได้ และแอปของคุณไม่จําเป็นต้องรองรับการโต้ตอบ เช่น ท่าทางสัมผัส หรือการเลื่อนและซูมแผนที่

ในโหมด Lite เจตนาที่จะเปิดแอป Google Maps บนอุปกรณ์เคลื่อนที่เมื่อผู้ใช้แตะแผนที่จะปิดใช้และเปิดใช้ในอุปกรณ์ที่สวมใส่ไม่ได้

ดูรายการความแตกต่างทั้งหมดระหว่างโหมด Lite กับโหมดที่โต้ตอบได้อย่างเต็มที่ได้ในเอกสารประกอบโหมด Lite

แถบเครื่องมือแผนที่ แถบเครื่องมือแผนที่ปิดอยู่และเปิดใช้งานในอุปกรณ์ที่สวมใส่ไม่ได้
ตัวควบคุม UI ระบบจะปิดใช้การควบคุม UI โดยค่าเริ่มต้นในอุปกรณ์ที่สวมใส่ได้ ซึ่งรวมถึงการควบคุมการซูม เข็มทิศ และตำแหน่งของฉัน คุณสามารถเปิดใช้โดยใช้คลาส UiSettings ได้ตามปกติ
ท่าทางสัมผัส ท่าทางสัมผัสแบบสัมผัสเดียวทำงานได้ตามที่คาดไว้ เช่น แตะและลากเพื่อเลื่อนแผนที่ แตะสองครั้งเพื่อซูมเข้า และแตะเซนเซอร์สองนิ้วเพื่อซูมออก การรองรับท่าทางสัมผัสแบบหลายจุดจะแตกต่างกันไปโดยขึ้นอยู่กับอุปกรณ์ของผู้ใช้ ตัวอย่างของท่าทางสัมผัสแบบหลายจุด ได้แก่ การกดด้วย 2 นิ้วเพื่อเอียงแผนที่ การบีบนิ้วเพื่อซูม และการหมุนด้วย 2 นิ้ว
แผนที่และอาคารในอาคาร แผนที่ในอาคารจะปิดใช้อยู่โดยค่าเริ่มต้นในอุปกรณ์ที่สวมใส่ได้ คุณเปิดใช้ได้โดยโทรไปที่ GoogleMap.setIndoorEnabled(true) หากเปิดใช้แผนที่ในอาคาร แผนที่จะแสดงชั้นเริ่มต้น อุปกรณ์ที่สวมใส่ได้ไม่รองรับองค์ประกอบ UI เครื่องมือเลือกระดับ
การวางซ้อนของชิ้นส่วนแผนที่ อุปกรณ์ที่สวมใส่ได้ไม่รองรับการวางซ้อนการ์ด

แนวทางปฏิบัติแนะนำสำหรับการพัฒนาด้วย Maps API ใน Wear OS

วิธีมอบประสบการณ์การใช้งานที่ดีที่สุดในแอป

  • แผนที่ควรใช้พื้นที่ส่วนใหญ่ของหน้าจอ ซึ่งจำเป็นต่อการเพิ่มประสิทธิภาพการใช้งานแผนที่ในอุปกรณ์แบบสวมใส่ขนาดเล็ก
  • เมื่อออกแบบประสบการณ์การใช้งานแอป ให้คำนึงถึงความจริงที่ว่าอุปกรณ์ที่สวมใส่ได้จะมีแบตเตอรี่เหลือน้อย การเปิดหน้าจอไว้และแสดงแผนที่อย่างต่อเนื่องจะส่งผลต่อประสิทธิภาพของแบตเตอรี่