
เมื่อใช้ 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: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
ในกิจกรรม ให้เพิ่มการเรียกกลับและตั้งค่าพฤติกรรมของโค้ดเรียกกลับให้ทำการปิดที่จำเป็นดังที่แสดงด้านล่าง
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); } // ... }
การเพิ่มแผนที่
ให้ใช้เมธอดโค้ดเรียกกลับของ onMapReady(GoogleMap)
ตามปกติเพื่อรับแฮนเดิลสำหรับออบเจ็กต์ GoogleMap ระบบจะทริกเกอร์การติดต่อกลับ
เมื่อแผนที่พร้อมใช้งาน ในวิธีเรียกกลับ คุณสามารถเพิ่มเครื่องหมายหรือโพลีไลน์ลงในแผนที่ เพิ่ม 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 ทั้งหมดจะหายไปในโหมดแอมเบียนท์ ซึ่งจะลดการใช้พลังงานของแอป และช่วยให้แอปมีรูปลักษณ์ที่สอดคล้องกับแอปแอมเบียนท์อื่นๆ เช่น หน้าปัด
ทำตามขั้นตอนต่อไปนี้เพื่อให้แอปใช้โหมดแอมเบียนท์ของแผนที่
- อัปเดต Android SDK ให้รวม Android 6.0 (API 23) ขึ้นไป ซึ่งให้ API ที่อนุญาตให้กิจกรรมต่างๆ เข้าสู่โหมดแอมเบียนท์ ดูข้อมูลเกี่ยวกับวิธีอัปเดต SDK ได้ในเอกสารประกอบของ Android เกี่ยวกับการเพิ่มแพ็กเกจ SDK
- ตรวจสอบว่าโปรเจ็กต์ของคุณกำหนดเป้าหมายเป็น Android 6.0 ขึ้นไป โดยตั้งค่า
targetSdkVersion
เป็น 23 ขึ้นไปในไฟล์ Manifest ของแอป - เพิ่มทรัพยากร Dependency ที่สวมใส่ได้ลงในไฟล์
build.gradle
ของแอป ดูตัวอย่างในหน้านี้ - เพิ่มรายการไลบรารีที่ใช้ร่วมกันของอุปกรณ์ที่สวมใส่ได้ลงในไฟล์ 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 นิ้วกดเพื่อเอียงแผนที่ บีบเพื่อซูม และการหมุน 2 นิ้ว |
แผนที่และอาคารในอาคาร |
แผนที่ในอาคารจะปิดใช้โดยค่าเริ่มต้นบนอุปกรณ์ที่สวมใส่ได้ คุณเปิดใช้ได้โดยโทรหา GoogleMap.setIndoorEnabled(true) หากเปิดใช้แผนที่ในอาคาร แผนที่จะแสดงระดับชั้นเริ่มต้น
องค์ประกอบ UI เครื่องมือเลือกระดับไม่ได้รับการสนับสนุนในอุปกรณ์ที่สวมใส่ได้ |
การวางซ้อนของชิ้นส่วนแผนที่ | ไม่รองรับการวางซ้อนของชิ้นส่วนแผนที่ในอุปกรณ์ที่สวมใส่ได้ |
แนวทางปฏิบัติแนะนำสำหรับการพัฒนาด้วย Maps API ใน Wear OS
วิธีมอบประสบการณ์ที่ดีที่สุดในแอปแก่ผู้ใช้
- แผนที่ควรใช้พื้นที่ส่วนใหญ่ของหน้าจอ วิธีนี้จำเป็นต่อการเพิ่มประสิทธิภาพความสามารถในการใช้งานแผนที่ในรูปแบบของอุปกรณ์ขนาดเล็กของอุปกรณ์ที่สวมใส่ได้
- เมื่อคุณออกแบบประสบการณ์ของผู้ใช้ในแอป ให้คำนึงถึงข้อเท็จจริงที่ว่าอุปกรณ์ที่สวมใส่ได้มีแบตเตอรี่ต่ำ ให้หน้าจอทำงานอยู่เสมอและ มองเห็นแผนที่จะส่งผลต่อประสิทธิภาพของแบตเตอรี่