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 เพื่อสร้างโมดูลอุปกรณ์ที่สวมใส่ได้ในแอป และตอนนี้ต้องการเพิ่มแผนที่ลงในโมดูลอุปกรณ์ที่สวมใส่ได้

การเพิ่มการพึ่งพาสําหรับโมดูล 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);
    }

    // ...
}

      

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

ใช้เมธอด Callback ของ 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 ขึ้นไปโดยการตั้งค่า เป็น 23 ขึ้นไปในไฟล์ Manifest ของแอปtargetSdkVersion
  3. เพิ่มข้อกำหนดเบื้องต้นของอุปกรณ์ที่สวมใส่ได้ในไฟล์ build.gradle.kts ของแอป ดูตัวอย่างในหน้านี้
  4. เพิ่มรายการไลบรารีที่ใช้ร่วมกันของอุปกรณ์ที่สวมใส่ลงในไฟล์ Manifest ของแอปที่สวมใส่ได้ตามที่อธิบายไว้ในชั้นเรียนการฝึกอบรม Android เกี่ยวกับการทำให้แอปปรากฏอยู่เสมอ
  5. เพิ่มสิทธิ์ WAKE_LOCK ลงในไฟล์ Manifest ของแอปในอุปกรณ์พกพาและอุปกรณ์ที่สวมใส่ได้ ตามที่อธิบายไว้ในชั้นเรียนการฝึกอบรม Android เกี่ยวกับการทำให้แอปปรากฏอยู่เสมอ
  6. ในเมธอด onCreate() ของกิจกรรม ให้เรียกใช้เมธอด AmbientModeSupport.attach() ซึ่งจะบอกระบบปฏิบัติการว่าแอปพลิเคชันเปิดอยู่เสมอ ดังนั้นเมื่ออุปกรณ์ปิดเครื่อง แอปพลิเคชันควรเข้าสู่โหมดแอมเบียนท์แทนที่จะกลับไปที่หน้าปัด
  7. ใช้อินเทอร์เฟซ AmbientModeSupport.AmbientCallbackProvider ในกิจกรรมเพื่อให้รับการเปลี่ยนแปลงสถานะโหมดแอมเบียนท์ได้
  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

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

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