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

ตรวจสอบว่าทรัพยากร Dependency ต่อไปนี้รวมอยู่ในไฟล์ build.gradle ของโมดูล 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:18.1.0'

    // This dependency is necessary for ambient mode
    implementation 'androidx.wear:wear:1.2.0'
}

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

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

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

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

เพิ่มองค์ประกอบ 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 ระบบจะทริกเกอร์การติดต่อกลับ เมื่อแผนที่พร้อมใช้งาน ในวิธีเรียกกลับ คุณสามารถเพิ่มเครื่องหมายหรือโพลีไลน์ลงในแผนที่ เพิ่ม Listener หรือย้ายกล้องได้ ตัวอย่างด้านล่างเพิ่มเครื่องหมายใกล้โรงอุปรากรซิดนีย์:

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 ขึ้นไปในไฟล์ Manifest ของแอป
  3. เพิ่มทรัพยากร Dependency ที่สวมใส่ได้ลงในไฟล์ build.gradle ของแอป ดูตัวอย่างในหน้านี้
  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 นิ้วกดเพื่อเอียงแผนที่ บีบเพื่อซูม และการหมุน 2 นิ้ว
แผนที่และอาคารในอาคาร แผนที่ในอาคารจะปิดใช้โดยค่าเริ่มต้นบนอุปกรณ์ที่สวมใส่ได้ คุณเปิดใช้ได้โดยโทรหา GoogleMap.setIndoorEnabled(true) หากเปิดใช้แผนที่ในอาคาร แผนที่จะแสดงระดับชั้นเริ่มต้น องค์ประกอบ UI เครื่องมือเลือกระดับไม่ได้รับการสนับสนุนในอุปกรณ์ที่สวมใส่ได้
การวางซ้อนของชิ้นส่วนแผนที่ ไม่รองรับการวางซ้อนของชิ้นส่วนแผนที่ในอุปกรณ์ที่สวมใส่ได้

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

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

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