באמצעות ה-SDK של מפות Google ל-Android, אפשר ליצור אפליקציה לבישה מבוססת מפה שפועלת ישירות במכשירי Wear OS by Google. משתמשי האפליקציה יוכלו לראות את המיקום שלהם במפה פשוט על ידי הצצה לפרקי היד שלהם. הם יכולים להציב את המיקום שלהם במסלול, לדוגמה, ואז להגדיל את התצוגה כדי לראות פרטים או להקיש על סמן כדי לראות חלון מידע שהאפליקציה מספקת.
בדף הזה מתוארת הפונקציונליות של ה-API שזמינה במכשיר Wear, ומוסבר איך מתחילים לפתח את האפליקציה.
תחילת העבודה עם Wear OS
תהליך הפיתוח של אפליקציה לבישה באמצעות ה-SDK של מפות Google ל-Android דומה לתהליך היצירה של אפליקציית מפות Google לכל מכשיר Android אחר. ההבדל הוא בעיצוב של האפליקציה בהתאם לגודל הקטן יותר של המכשיר לביש, כדי לשפר את נוחות השימוש והביצועים שלה.
Android Studio הוא הכלי המומלץ לפיתוח Wear OS, כי הוא מספק נוחות בהגדרת פרויקטים, בהכללת ספריות ובאריזה.
לקבלת עזרה כללית בעיצוב אפליקציה לבישה, כדאי לעיין בהנחיות העיצוב של Wear OS. לקבלת עזרה ביצירת האפליקציה הלבישה הראשונה שלכם, כדאי לעיין במדריך ליצירת אפליקציות לבישות.
פיתוח אפליקציית המפות הראשונה שלך ב-Wear OS
המדריך המהיר הזה מבוסס על ההנחה שאתם מכירים את ה-SDK של מפות Google ל-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
, אפשר להטמיע את התנועה החלקה כדי לסגור, שמאפשרת למשתמשים לצאת מהאפליקציה על ידי החלקה מהקצה הימני ביותר של המסך.
כדי להגדיר צבע רקע ראשוני בהתאמה אישית, משתמשים במאפיין ה-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); } // ... }
הוספת מפה
משתמשים בשיטת ה-callback onMapReady(GoogleMap)
כרגיל כדי לקבל אחיזה באובייקט GoogleMap. הקריאה החוזרת מופעלת כשהמפה מוכנה לשימוש. בשיטת הקריאה החוזרת ניתן להוסיף סמנים או קווים פוליגוניים למפה, להוסיף מאזינים או להזיז את המצלמה. בדוגמה הבאה מתווסף סמן ליד בית האופרה של סידני:
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)); }
הפעלת מצב אווירה
ה-SDK של מפות Google ל-Android תומך במצב רגישות לאפליקציות לבישות. אפליקציות שתומכות במצב רגישות לסביבה נקראות לפעמים אפליקציות תמיד זמינות. מצב רגישות לסביבה מופעל כשהמשתמש כבר לא משתמש באפליקציה באופן פעיל, ומאפשר לאפליקציה להישאר גלויה במכשיר לביש.
ה-SDK של מפות Google ל-Android מספק רינדור פשוט של המפה עם פחות צבעים לשימוש במצב אווירה. סגנון המפה משתנה באופן אוטומטי כשהמכשיר עובר ממצב אינטראקטיבי למצב אווירה. כל הסמנים, האובייקטים והפקדים בממשק המשתמש נעלמים במצב רגישות לסביבה. כך תפחיתו את צריכת החשמל של האפליקציה ותבטיחו מראה וסגנון עקביים באפליקציות אווירה אחרות, כמו תצוגות שעון.
כדי לוודא שהאפליקציה שלכם משתמשת בתאורת האווירה של המפה:
- מעדכנים את Android SDK כך שיכלול את הפלטפורמה Android 6.0 (API 23) ואילך, שמספקת את ממשקי ה-API שמאפשרים לפעילויות לעבור למצב אווירה. רוצים לדעת איך לעדכן את ה-SDK? עיינו במאמרי העזרה של Android בנושא הוספת חבילות SDK.
- חשוב לוודא שהפרויקט מטרגט את Android 6.0 ואילך, על ידי הגדרת הערך של
targetSdkVersion
לערך 23 ואילך במניפסט האפליקציה. - צריך להוסיף את יחסי התלות הלבישים לקובץ
build.gradle.kts
של האפליקציה. בדוגמה בדף הזה. - מוסיפים את הרשומה של הספרייה המשותפת הלבישת לקובץ המניפסט של האפליקציה הלבישת, כפי שמתואר בשיעור ההדרכה של Android בנושא שמירה על חשיפה של האפליקציה.
- מוסיפים את ההרשאה
WAKE_LOCK
למניפסטים של האפליקציות לנייד ולמכשירים לבישים, כפי שמתואר בסדנת הדרכה של Android בנושא שמירה על החשיפה של האפליקציה. - ב-method
onCreate()
של הפעילות, קוראים ל-methodAmbientModeSupport.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 בסיסית ב-Wear OS.
הפונקציונליות הנתמכת ב-Maps API ב-Wear OS
בקטע הזה מפורטים ההבדלים בפונקציונליות הנתמכת של מפות במכשירים לבישים, בהשוואה למכשירים ניידים (טלפונים וטאבלטים). כל תכונות ה-API שלא צוינו למטה אמורות לפעול לפי התיעוד המלא של ה-API.
פונקציונליות | |
---|---|
מצב אינטראקטיבי מלא ומצב טעינה מהירה | אפשר להשתמש ב-SDK של מפות ל-Android במצב אינטראקטיבי מלא או במצב טעינה מהירה. מומלץ להשתמש במצב בסיסי אם רוצים לבצע אופטימיזציה של הביצועים במכשיר לביש, והאפליקציה לא צריכה לתמוך באינטראקציה כמו תנועות או החלקה והגדלת המפה. במצב בסיסי, הכוונה להפעיל את אפליקציית מפות Google לנייד כשהמשתמש מקייש על המפה מושבתת ולא ניתן להפעיל אותה במכשיר לביש. במסמכי העזרה של מצב Lite תוכלו למצוא רשימה מלאה של ההבדלים בין מצב Lite לבין מצב אינטראקטיבי מלא. |
סרגל הכלים של המפה | סרגל הכלים של המפה מושבת ואי אפשר להפעיל אותו במכשיר לביש. |
פקדים בממשק המשתמש | פקדי
ממשק המשתמש מושבתים כברירת מחדל במכשירים לבישים. כולל את הלחצנים לשינוי מרחק התצוגה, לכיוון ולמיקום שלי. אפשר להפעיל אותן באמצעות הכיתה UiSettings כרגיל.
|
תנועות | תנועות בנגיעה אחת פועלות כמצופה. לדוגמה, אפשר לגעת ולגרור כדי להזיז את המפה, להקיש הקשה כפולה כדי להגדיל את התצוגה ולהקיש עם שתי אצבעות כדי להקטין את התצוגה. התמיכה בתנועות מגע מרובות משתנה בהתאם למכשיר של המשתמש. דוגמאות לתנועות עם כמה נקודות מגע כוללות דחיפה באמצעות שתי אצבעות כדי להטות את המפה, תנועת צביטה לשינוי מרחק התצוגה וסיבוב של שתי אצבעות. |
מפות פנים ובניינים |
מפות פנים מושבתות כברירת מחדל במכשיר לביש. כדי להפעיל אותן, צריך להתקשר אל
GoogleMap.setIndoorEnabled(true) . אם מפות הפנים מופעלות, במפה יוצג קומה שמוגדרת כברירת מחדל.
רכיב ממשק המשתמש של בורר הרמה לא נתמך במכשירים לבישים. |
שכבות-על של משבצות | שכבות-על של אריחים לא נתמכות במכשירים לבישים. |
שיטות מומלצות לפיתוח באמצעות Maps API ב-Wear OS
איך מספקים את חוויית המשתמש הטובה ביותר באפליקציה:
- המפה צריכה לתפוס חלק גדול מהמסך. הפעולה הזו נחוצה כדי לשפר את נוחות השימוש במפה במכשיר הלבוש הקטן.
- כשמעצבים את חוויית המשתמש באפליקציה, חשוב להביא בחשבון את העובדה שרמת הטעינה של הסוללה במכשיר לביש נמוכה. אם המסך יישאר פעיל והמפה תהיה גלויה, הביצועים של הסוללה יושפעו.