เมื่อใช้ 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 เพื่อสร้างโมดูลอุปกรณ์ที่สวมใส่ได้ในแอป และตอนนี้ต้องการเพิ่มแผนที่ลงในโมดูลอุปกรณ์ที่สวมใส่ได้
การเพิ่มการพึ่งพาสําหรับโมดูล 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 ระบบจะเรียกใช้การเรียกกลับเมื่อแผนที่พร้อมใช้งาน ในเมธอดการเรียกกลับ คุณสามารถเพิ่มเครื่องหมายหรือเส้นประกอบลงในแผนที่ เพิ่ม Listeners หรือย้ายกล้อง ตัวอย่างด้านล่างจะเพิ่มเครื่องหมายใกล้กับโรงอุปรากรซิดนีย์
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 ทั้งหมดจะหายไปในโหมดแอมเบียนท์ ซึ่งจะช่วยลดการใช้พลังงานของแอปและช่วยให้รูปลักษณ์ของแอปสอดคล้องกับแอปอื่นๆ ในโหมดแอมเบียนท์ เช่น หน้าปัด
ทำตามขั้นตอนต่อไปนี้เพื่อให้แน่ใจว่าแอปของคุณใช้โหมดแอมเบียนท์ของแผนที่
- อัปเดต Android SDK ให้รวมแพลตฟอร์ม Android 6.0 (API 23) ขึ้นไป ซึ่งจะมี API ที่อนุญาตให้กิจกรรมเข้าสู่โหมดแอมเบียนท์ ดูข้อมูลเกี่ยวกับวิธีอัปเดต SDK ได้ที่เอกสารประกอบของ Android เกี่ยวกับการเพิ่มแพ็กเกจ SDK
- ตรวจสอบว่าโปรเจ็กต์กำหนดเป้าหมายเป็น Android 6.0 ขึ้นไปโดยการตั้งค่า เป็น 23 ขึ้นไปในไฟล์ Manifest ของแอป
targetSdkVersion
- เพิ่มข้อกำหนดเบื้องต้นของอุปกรณ์ที่สวมใส่ได้ในไฟล์
build.gradle.kts
ของแอป ดูตัวอย่างในหน้านี้ - เพิ่มรายการไลบรารีที่ใช้ร่วมกันของอุปกรณ์ที่สวมใส่ลงในไฟล์ Manifest ของแอปที่สวมใส่ได้ตามที่อธิบายไว้ในชั้นเรียนการฝึกอบรม Android เกี่ยวกับการทำให้แอปปรากฏอยู่เสมอ
- เพิ่มสิทธิ์
WAKE_LOCK
ลงในไฟล์ Manifest ของแอปในอุปกรณ์พกพาและอุปกรณ์ที่สวมใส่ได้ ตามที่อธิบายไว้ในชั้นเรียนการฝึกอบรม Android เกี่ยวกับการทำให้แอปปรากฏอยู่เสมอ - ในเมธอด
onCreate()
ของกิจกรรม ให้เรียกใช้เมธอดAmbientModeSupport.attach()
ซึ่งจะบอกระบบปฏิบัติการว่าแอปพลิเคชันเปิดอยู่เสมอ ดังนั้นเมื่ออุปกรณ์ปิดเครื่อง แอปพลิเคชันควรเข้าสู่โหมดแอมเบียนท์แทนที่จะกลับไปที่หน้าปัด - ใช้อินเทอร์เฟซ
AmbientModeSupport.AmbientCallbackProvider
ในกิจกรรมเพื่อให้รับการเปลี่ยนแปลงสถานะโหมดแอมเบียนท์ได้ - ตั้งค่าแผนที่ให้รองรับโหมดแอมเบียนท์ ซึ่งทำได้โดยการตั้งค่าแอตทริบิวต์
map:ambientEnabled="true"
ในไฟล์เลย์เอาต์ XML ของกิจกรรม หรือทำแบบเป็นโปรแกรมโดยการตั้งค่าGoogleMapOptions.ambientEnabled(true)
การตั้งค่านี้จะแจ้งให้ API โหลดข้อมูลแผนที่ที่จำเป็นไว้ล่วงหน้าเพื่อใช้ในโหมดแอมเบียนท์ - เมื่อกิจกรรมเปลี่ยนเป็นโหมดแอมเบียนท์ ระบบจะเรียกใช้เมธอด
onEnterAmbient()
ในAmbientCallback
ที่คุณระบุ ลบล้างonEnterAmbient()
แล้วโทรหาSupportMapFragment.onEnterAmbient(ambientDetails)
หรือMapView.onEnterAmbient(ambientDetails)
API จะเปลี่ยนไปใช้การแสดงผลแผนที่แบบไม่อินเทอร์แอกทีฟและสีต่ำ - ในทำนองเดียวกัน ใน
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 นิ้ว |
แผนที่และอาคารในอาคาร |
แผนที่ในอาคารจะปิดอยู่โดยค่าเริ่มต้นในอุปกรณ์ที่สวมใส่ได้ ซึ่งทำได้โดยโทรไปที่ GoogleMap.setIndoorEnabled(true) หากเปิดใช้แผนที่ในอาคาร แผนที่จะแสดงระดับชั้นเริ่มต้น
อุปกรณ์ที่สวมใส่ได้ไม่รองรับองค์ประกอบ UI เครื่องมือเลือกระดับ |
การวางซ้อนของชิ้นส่วนแผนที่ | อุปกรณ์ที่สวมใส่ได้ไม่รองรับการวางซ้อนไทล์ |
แนวทางปฏิบัติแนะนำสำหรับการพัฒนาด้วย Maps API ใน Wear OS
วิธีมอบประสบการณ์การใช้งานที่ดีที่สุดในแอป
- แผนที่ควรใช้พื้นที่ส่วนใหญ่ของหน้าจอ ซึ่งจำเป็นต้องทำเพื่อเพิ่มประสิทธิภาพการใช้งานแผนที่ในอุปกรณ์แบบสวมใส่ที่มีขนาดเล็ก
- เมื่อออกแบบประสบการณ์การใช้งานแอป ให้คำนึงถึงความจริงที่ว่าอุปกรณ์ที่สวมใส่ได้จะมีแบตเตอรี่เหลือน้อย การเปิดหน้าจอไว้และแสดงแผนที่อย่างต่อเนื่องจะส่งผลต่อประสิทธิภาพของแบตเตอรี่