Maps API บน Wear OS

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

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

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

เริ่มต้นใช้งาน 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 ในกิจกรรม ให้เพิ่มโค้ดเรียกกลับและตั้งค่าการทํางานของโค้ดเรียกกลับให้ดําเนินการปิดตามต้องการ ดังที่แสดงด้านล่าง

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

    // ...
}

      

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

    // ...
}

      

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

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

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

      

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

      

กําลังเปิดใช้โหมดแอมเบียนท์

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 ของแอป ดูตัวอย่างในหน้านี้
  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 จะเปลี่ยนไปใช้การแสดงผลปกติของแผนที่

ตัวอย่างโค้ดต่อไปนี้จะเปิดใช้โหมดแอมเบียนท์ในกิจกรรม

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

      

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

      

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

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

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