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