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:19.0.0'

    // This dependency is necessary for ambient mode
    implementation 'androidx.wear:wear:1.3.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 ในกิจกรรมแล้ว ให้เพิ่ม Callback และกำหนดลักษณะการทำงานของ Callback เพื่อดำเนินการปิดที่จำเป็นดังที่แสดงด้านล่าง

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

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

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