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

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

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

      

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

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

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

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

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

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

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

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