Maps 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 สำหรับโมดูลสำหรับอุปกรณ์สวมใส่
ตรวจสอบว่าได้รวมทรัพยากร Dependency ต่อไปนี้ไว้ในไฟล์ build.gradle.kts ของโมดูล Wear OS ของแอป
dependencies { // ... // Modern Android projects use version catalogs to manage dependencies. To include the necessary dependencies, // first add the following to your libs.versions.toml file: // // [versions] // playServicesMaps = "20.0.0" // wear = "1.3.0" // wearable = "2.9.0" // // [libraries] // play-services-maps = { group = "com.google.android.gms", name = "play-services-maps", version.ref = "playServicesMaps" } // wear = { group = "androidx.wear", name = "wear", version.ref = "wear" } // wearable-compile = { group = "com.google.android.wearable", name = "wearable", version.ref = "wearable" } // wearable-support = { group = "com.google.android.support", name = "wearable", version.ref = "wearable" } compileOnly(libs.wearable.compile) implementation(libs.wearable.support) implementation(libs.play.services.maps) // This dependency is necessary for ambient mode implementation(libs.wear) // Android Test Dependencies androidTestImplementation(libs.ext.junit) androidTestImplementation(libs.espresso.core) androidTestImplementation(libs.uiautomator) androidTestImplementation(libs.truth) androidTestImplementation(libs.junit) // If your project does not use a version catalog, you can use the following dependencies instead: // // 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:20.0.0") // implementation("androidx.wear:wear:1.3.0") // androidTestImplementation("androidx.test.ext:junit:1.1.5") // androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") // androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0") // androidTestImplementation("com.google.truth:truth:1.4.2") // androidTestImplementation("junit:junit:4.13.2") }
ดูข้อมูลเพิ่มเติมเกี่ยวกับทรัพยากร 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(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 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 คุณสามารถเพิ่มตัวทำเครื่องหมายหรือเส้นประกอบลงในแผนที่ เพิ่ม 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.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(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 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 ระบบจะปิดใช้ Intent เพื่อเริ่มแอป Google Maps บนมือถือเมื่อผู้ใช้แตะแผนที่ และไม่สามารถเปิดใช้ในอุปกรณ์ที่สวมใส่ได้ ดูรายการความแตกต่างทั้งหมดระหว่างโหมด Lite กับโหมดอินเทอร์แอกทีฟเต็มรูปแบบได้ในเอกสารประกอบโหมด Lite |
| แถบเครื่องมือแผนที่ | ระบบจะปิดใช้ แถบเครื่องมือแผนที่และไม่สามารถเปิดใช้ในอุปกรณ์ที่สวมใส่ได้ |
| ตัวควบคุม UI | ระบบจะปิดใช้ตัวควบคุม UI
controls ในอุปกรณ์สวมใส่โดยค่าเริ่มต้น ซึ่งรวมถึง
ตัวควบคุมการซูม เข็มทิศ และตำแหน่งของฉัน คุณสามารถเปิดใช้ตัวควบคุมเหล่านี้ได้โดยใช้
UiSettings
คลาสตามปกติ
|
| ท่าทางสัมผัส | ท่าทางสัมผัสแบบแตะครั้งเดียว ทำงานตามที่คาดไว้ ตัวอย่างเช่น แตะและลากเพื่อเลื่อนแผนที่ แตะสองครั้ง เพื่อซูมเข้า และแตะ 2 นิ้วเพื่อซูมออก การรองรับท่าทางสัมผัสแบบมัลติทัชจะแตกต่างกันไปตามอุปกรณ์ของผู้ใช้ ตัวอย่างท่าทางสัมผัสแบบมัลติทัช ได้แก่ การดัน 2 นิ้วเพื่อเอียงแผนที่, การบีบเพื่อซูม และการหมุน 2 นิ้ว |
| แผนที่ในอาคารและอาคาร |
ระบบจะปิดใช้แผนที่ในอาคาร
ในอุปกรณ์ที่สวมใส่ได้โดยค่าเริ่มต้น คุณสามารถเปิดใช้ได้โดยเรียก
GoogleMap.setIndoorEnabled(true) หากเปิดใช้แผนที่ในอาคาร
แผนที่จะแสดงระดับชั้นเริ่มต้น
อุปกรณ์สวมใส่ไม่รองรับองค์ประกอบ UI ของตัวเลือกระดับ
ตัวเลือก |
| การวางซ้อนของชิ้นส่วนแผนที่ | อุปกรณ์สวมใส่ ไม่รองรับ การวางซ้อนของชิ้นส่วนแผนที่ |
แนวทางปฏิบัติแนะนำสำหรับการพัฒนาด้วย Maps API บน Wear OS
วิธีมอบประสบการณ์การใช้งานที่ดีที่สุดแก่ผู้ใช้ในแอป
- แผนที่ควรมีสัดส่วนพื้นที่บนหน้าจอมาก ซึ่งจำเป็นต่อการเพิ่มประสิทธิภาพการใช้งานแผนที่ในฟอร์มแฟกเตอร์ขนาดเล็กของอุปกรณ์สวมใส่
- เมื่อออกแบบประสบการณ์ของผู้ใช้สำหรับแอปของคุณ ให้คำนึงถึงข้อเท็จจริงที่ว่าอุปกรณ์ที่สวมใส่ได้มีพลังงานแบตเตอรี่ต่ำ การเปิดหน้าจอไว้และแสดงแผนที่จะส่งผลต่อประสิทธิภาพของแบตเตอรี่