Maps API บน Wear OS

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

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

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

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

โดยพื้นฐานแล้ว การสร้างแอปสำหรับอุปกรณ์สวมใส่ด้วย Maps SDK สำหรับ Android เช่นเดียวกับการสร้างแอป Google แผนที่สำหรับอุปกรณ์ 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);
    }

    // ...
}

      

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

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

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

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

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

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