אפליקציות מצלמה מודרניות מוגדרות על ידי תכונות חזקות וחופפות. המשתמשים מצפים לצלם סרטונים באיכות HDR מדהימה, לתעד תנועה חלקה בקצב של 60FPS ולקבל קטעי וידאו חלקים במיוחד עם ייצוב בתצוגה המקדימה – לעיתים קרובות, כל זה בו-זמנית.
כמפתחים, אנחנו יודעים שהמציאות מורכבת יותר. איך אפשר להבטיח שמכשיר ספציפי באמת תומך בשילוב מסוים? עד עכשיו, הפעלה של כמה תכונות הייתה לעיתים קרובות הימור. אפשר לבדוק אם יש תמיכה בתכונות ספציפיות, אבל שילוב שלהן עלול להוביל להתנהגות לא מוגדרת או, גרוע מכך, לסשן מצלמה שנכשל. חוסר הוודאות הזה מאלץ את המפתחים להיות שמרנים, ומונע ממשתמשים במכשירים מתאימים ליהנות מחוויית השימוש הטובה ביותר.
לדוגמה, יש מעט מאוד מכשירי פרימיום שתומכים באופן אמין בווידאו באיכות HDR ובקצב של 60 פריימים לשנייה בו-זמנית. לכן, ברוב האפליקציות לא מפעילים את שתי האפשרויות בו-זמנית, כדי למנוע חוויית משתמש גרועה ברוב הטלפונים.
כדי לפתור את הבעיה הזו, אנחנו משיקים את Feature Group ב-CameraX – ממשק API חדש שנועד למנוע את הניחושים האלה. עכשיו אתם יכולים לבדוק אם שילוב ספציפי של תכונות נתמך לפני שאתם מגדירים את המצלמה, או פשוט להגדיר את סדרי העדיפויות שלכם ב-CameraX ולאפשר לו להפעיל את השילוב הנתמך הטוב ביותר בשבילכם.
למשתמשים חדשים ב-CameraX
לפני שנתחיל להשתמש ב-Feature Group API החדש, נסביר בקצרה מה זה CameraX. CameraX היא ספריית תמיכה של Jetpack, שנועדה לעזור לכם לפתח אפליקציות מצלמה בקלות רבה יותר. הוא מספק ממשק API עקבי וקל לשימוש שפועל ברוב מכשירי Android, עם תאימות לדורות קודמים עד Android 6.0 (רמת API 23). אם אתם משתמשים חדשים ב-CameraX, מומלץ לעיין במאמרי העזרה הרשמיים ולנסות את Codelab כדי להתחיל.
מה אפשר ליצור באמצעות Feature Group API
אתם כבר לא צריכים לנחש אילו שילובי תכונות יעבדו, ויכולים לספק בביטחון את חוויית השימוש הטובה ביותר במצלמה – כמו וידאו HDR ו-60 FPS בו-זמנית בחומרה מתאימה (למשל, Pixel 10 Pro) – תוך הימנעות משגיאות במכשירים שלא תומכים בשילוב הזה.
באמצעות Feature Group API, אתם יכולים:
- ממשקי משתמש חכמים ודינמיים יותר: אפשר להפעיל או להשבית הגדרות בממשק המשתמש בצורה חכמה על סמך תמיכה בחומרה בזמן אמת. לדוגמה, אם משתמש מפעיל HDR, אתם יכולים להפוך את האפשרות של 60FPS לאפורה ולהשבית אותה באופן מיידי אם השילוב לא נתמך במכשיר הזה.
- מצב "איכות גבוהה" אמין: מגדירים את המצלמה עם רשימה של תכונות רצויות לפי סדר עדיפויות. CameraX מוצאת ומפעילה באופן אוטומטי את השילוב הנתמך הטוב ביותר לכל מכשיר נתון, ומבטיחה תוצאה מצוינת בלי לוגיקה מורכבת וספציפית למכשיר.
- מניעת כשלים בסשנים של המצלמה: כשבודקים מראש אם יש תמיכה, המצלמה לא מנסה להגדיר שילוב שלא נתמך. כך אפשר למנוע קריסות נפוצות ולספק חוויית משתמש חלקה.
איך זה עובד: הרכיבים העיקריים
ה-API החדש מתמקד בתוספות חשובות ל-SessionConfig ול-CameraInfo.
- GroupableFeature: ה-API הזה כולל קבוצה של תכונות מוגדרות מראש שאפשר לקבץ, כמו HDR_HLG10, FPS_60, PREVIEW_STABILIZATION ו-IMAGE_ULTRA_HDR. בגלל מגבלות חישוביות, רק קבוצה ספציפית של תכונות יכולה להיות מקובצת עם רמת האמינות הגבוהה שה-API הזה מספק. אנחנו פועלים כדי להרחיב את הרשימה הזו ונוסיף תמיכה בתכונות נוספות בגרסאות עתידיות.
- פרמטרים חדשים של SessionConfig: המחלקה הזו, שמשמשת להפעלת סשן מצלמה, מקבלת עכשיו שני פרמטרים חדשים:
-
requiredFeatureGroup: משתמשים באפשרות הזו לתכונות שחייבות להיות נתמכות כדי שההגדרה תצליח – אידיאלי לתכונות שמשתמש מפעיל באופן מפורש, כמו הפעלת מתג "HDR". כדי להבטיח חוויה דטרמיניסטית ועקבית, הקריאה ל-bindToLifecycleתפעילIllegalArgumentExceptionאם השילוב המבוקש לא נתמך, במקום להתעלם בשתיקה מבקשה להוספת תכונה. כדי לשלוח שאילתה על התוצאה הזו מראש, צריך להשתמש ב-API שלCameraInfo#isFeatureGroupSupported(פרטים בהמשך). -
preferredFeatureGroup: משתמשים בערך הזה לתכונות רצויות אבל אופציונליות, לדוגמה כשרוצים להטמיע מצב ברירת מחדל של "איכות גבוהה". אתם מספקים רשימה של התכונות הרצויות לפי סדר העדיפויות שלכם, ו-CameraX מפעילה באופן אוטומטי את השילוב בעל העדיפות הגבוהה ביותר שהמכשיר תומך בו.
-
- thought
CameraInfo#isFeatureGroupSupported(): זו השיטה העיקרית לשאילתות כדי לבדוק באופן מפורש אם קבוצת תכונות נתמכת, והיא מתאימה מאוד להצגת אפשרויות של תכונות נתמכות בלבד למשתמשים בממשק המשתמש של האפליקציה. מעבירים אליה
SessionConfig, והיא מחזירה ערך בוליאני שמציין אם השילוב נתמך. אם אתם מתכוונים לקשרSessionConfigעם תכונות נדרשות, כדאי להשתמש קודם ב-API הזה כדי לוודא שיש תמיכה.
הטמעה בפועל
בואו נראה איך להשתמש ברכיבים האלה כדי ליצור חוויית שימוש טובה יותר במצלמה.
תרחיש 1: מצב איכות גבוהה "במידת האפשר"
אם רוצים להפעיל את התכונות הכי טובות כברירת מחדל, אפשר לספק ל-preferredFeatureGroup רשימה לפי סדר עדיפויות. בדוגמה הזו, אנחנו מגדירים ל-CameraX לתת עדיפות ל-HDR, אחר כך ל-60 FPS ולבסוף לייצוב התצוגה המקדימה. CameraX מטפל במורכבות של בדיקת כל השילובים האפשריים ובחירת השילוב הטוב ביותר שהמכשיר תומך בו.
לדוגמה, אם מכשיר יכול להפעיל HDR ו-60 FPS ביחד אבל לא עם ייצוב התצוגה המקדימה, CameraX יפעיל את שתי התכונות הראשונות וישבית את השלישית. כך אתם מקבלים את חוויית השימוש הטובה ביותר בלי לכתוב בדיקות מורכבות ספציפיות למכשיר.
cameraProvider.bindToLifecycle(
lifecycleOwner,
cameraSelector,
SessionConfig(
useCases = listOf(preview, videoCapture),
// The order of features in this list determines their priority.
// CameraX will enable the best-supported combination based on these
// priorities: HDR_HLG10 > FPS_60 > Preview Stabilization.
preferredFeatureGroup =
listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION),
).apply {
// (Optional) Get a callback with the enabled features
// to update your UI.
setFeatureSelectionListener { selectedFeatures ->
updateUiIndicators(selectedFeatures)
}
}
)בקטע הקוד הזה, CameraX ינסה להפעיל שילובי תכונות לפי סדר העדיפויות הבא, ויבחר את השילוב הראשון שהמכשיר תומך בו באופן מלא:
- HDR + 60 FPS + ייצוב התצוגה המקדימה
- HDR + 60 פריימים לשנייה (FPS)
- HDR + ייצוב תצוגה מקדימה
- HDR
- 60 FPS + ייצוב תצוגה מקדימה
- 60 FPS
- ייצוב התצוגה המקדימה
- אף אחת מהתכונות שלמעלה
תרחיש 2: פיתוח ממשק משתמש ריאקטיבי
כדי ליצור ממשק משתמש שמגיב לבחירות של המשתמשים ומונע מהם לבחור שילוב תכונות שלא נתמך, אתם יכולים לשלוח שאילתה ישירות לגבי התמיכה. הפונקציה הבאה בודקת אילו תכונות לא תואמות לבחירות הנוכחיות של המשתמש, ומאפשרת לכם להשבית את הרכיבים המתאימים בממשק המשתמש.
/**
* Returns a list of features that are NOT supported in combination
* with the currently selected features.
*/
fun getUnsupportedFeatures(
currentFeatures: Set<GroupableFeature>
): Set<GroupableFeature> {
val unsupportedFeatures = mutableSetOf<GroupableFeature>()
val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)
// Iterate over every available feature option in your app.
appFeatureOptions.forEach { featureOption ->
// Skip features the user has already selected.
if (currentFeatures.contains(featureOption)) return@forEach
// Check if adding this new feature is supported.
val isSupported = cameraInfo.isFeatureGroupSupported(
SessionConfig(
useCases = useCases,
// Check the new feature on top of existing ones.
requiredFeatureGroup = currentFeatures + featureOption
)
)
if (!isSupported) {
unsupportedFeatures.add(featureOption)
}
}
return unsupportedFeatures
}לאחר מכן, תוכלו לחבר את הלוגיקה הזו לבקר של ה-ViewModel או של ממשק המשתמש כדי להגיב לקלט של המשתמש ולקשר מחדש את המצלמה עם הגדרה שתעבוד בוודאות.
// Invoked when user turns some feature on/off.
fun onFeatureChange(currentFeatures: Set<GroupableFeature>) {
// Identify features that are unsupported with the current selection.
val unsupportedFeatures = getUnsupportedFeatures(currentFeatures)
// Update app UI so that users can't enable them.
updateDisabledFeatures(unsupportedFeatures)
// Since the UI now only allows selecting supported feature combinations,
// `currentFeatures` is always valid. This allows setting
// `requiredFeatureGroup` directly, without needing to re-check for
// support or set a feature selection listener.
cameraProvider.bindToLifecycle(
lifecycleOwner,
cameraSelector,
SessionConfig(
useCases = listOf(preview, videoCapture),
requiredFeatureGroup = currentFeatures,
)
)
}כדי לראות את המושגים האלה באפליקציה פעילה, אתם יכולים לעיין באפליקציית הבדיקה הפנימית שלנו. היא מספקת הטמעה מלאה של שני התרחישים שנדונו למעלה: "המאמץ המרבי" ו "ממשק משתמש תגובתי".
חשוב לדעת: זו אפליקציית בדיקה ולא דוגמה שנתמכת באופן רשמי. הוא משמש כחומר עזר מצוין ל-Feature Group API, אבל הוא לא עבר ליטוש לשימוש בסביבת ייצור.
מתחילים עוד היום
ה-Feature Group API מסיר את חוסר הבהירות בעבודה עם יכולות מתקדמות של המצלמה. האפשרות הזו מספקת דרך דטרמיניסטית לשלוח שאילתות לגבי תמיכה בתכונות, וכך אתם יכולים לפתח אפליקציות מצלמה חזקות ואמינות יותר.
ה-API זמין כניסיוני ב-CameraX 1.5, והוא צפוי להיות יציב לחלוטין בגרסה 1.6, עם תמיכה נוספת ושיפורים בדרך.
מידע נוסף זמין במסמכים הרשמיים. אנחנו כבר ממש סקרנים לראות את הדברים שיצא לך ליצור, ונשמח לקבל ממך משוב. נשמח לשמוע את דעתך ולקבל דיווחים על בעיות באמצעות הערוצים הבאים:
-
חדשות על המוצרהיום, במפגש של מפתחי Android, אנחנו מכריזים על הזמינות הרחבה של הרבה כלים וממשקי API שנועדו להסיר את החיכוך היומיומי ולתת לכם יותר גמישות ליצור אפליקציות Android נהדרות.
Matthew McCullough • משך הקריאה: 4 דקות -
חדשות על המוצרגרסת Android Studio Rabbit 2 יציבה ומוכנה לשימוש בסביבת הייצור. הגרסה הזו כוללת תכונות חשובות שמשפרות את הפיתוח, כמו Bring Your Own Agent, תכונות חדשות של אמולטור XR, עדכון של LeakCanary, כלי חדש לניהול מיומנויות של סוכנים, סקר קוד באמצעות AI ועוד.
Matthew Warner • משך הקריאה: 3 דקות -
חדשות על המוצראפליקציות שמטרגטות את הגרסה הבאה של Android לא יוכלו יותר לכתוב ישירות לאנשי קשר באמצעות ההרשאה WRITE_CONTACTS.
Roxanna Aliabadi Walker • משך הקריאה: 6 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?