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