אפליקציות מצלמה מודרניות מוגדרות על ידי תכונות חזקות שחופפות זו לזו. המשתמשים מצפים להקליט סרטונים באיכות HDR מדהימה, לצלם תנועה חלקה בקצב של 60 פריימים לשנייה (FPS) ולקבל צילומים חלקים מאוד בעזרת התכונה 'ייצוב בתצוגה מקדימה' – ולעתים קרובות, הכול בו-זמנית.
אנחנו מפתחים, ולכן ברור לנו שהמציאות מורכבת יותר. איך אפשר להבטיח שמכשיר מסוים תומך בשילוב נתון? עד עכשיו, הפעלת כמה תכונות הייתה לרוב הימור. אפשר לבדוק אם כל תכונה נתמכת, אבל שילוב של כמה תכונות עלול להוביל להתנהגות לא מוגדרת או, גרוע מכך, לסשן מצלמה שנכשל. חוסר הוודאות הזה מאלץ את המפתחים להיות שמרנים, ומונע ממשתמשים במכשירים מתאימים ליהנות מהחוויה הטובה ביותר.
לדוגמה, רק מעט מכשירי פרימיום תומכים בווידאו באיכות HDR ובקצב של 60 פריימים לשנייה בו-זמנית. לכן, ברוב האפליקציות לא מפעילים את שתי האפשרויות בו-זמנית כדי למנוע חוויית משתמש גרועה ברוב הטלפונים.
כדי לפתור את הבעיה הזו, אנחנו משיקים את Feature Group ב-CameraX – API חדש שנועד לבטל את הניחושים האלה. עכשיו אפשר לשאול אם שילוב מסוים של תכונות נתמך לפני שמגדירים את המצלמה, או פשוט להגדיר ל-CameraX את סדר העדיפויות ולתת לה להפעיל את השילוב הנתמך הכי טוב בשבילכם.
למשתמשים חדשים ב-CameraX
לפני שנעמיק ב-API החדש של קבוצת התכונות, נסביר בקצרה מהו CameraX. CameraX היא ספריית תמיכה של Jetpack, שנועדה לעזור לכם לפתח אפליקציות מצלמה בקלות רבה יותר. הוא מספק ממשק API עקבי וקל לשימוש שפועל ברוב מכשירי Android, עם תאימות לאחור ל-Android 6.0 (רמת API 23). אם אתם חדשים ב-CameraX, מומלץ לעיין בתיעוד הרשמי ולנסות את ה-codelab כדי להתחיל.
מה אפשר ליצור באמצעות Feature Group API
לא צריך יותר לנחש אילו שילובים של תכונות יפעלו, ואפשר לספק בביטחון את חוויית המצלמה הכי טובה שאפשר – כמו סרטון HDR ו-60 FPS בו-זמנית בחומרה מתאימה (למשל Pixel 10 Pro) – תוך הימנעות משגיאות במכשירים שלא תומכים בשילוב הזה.
Pixel 10 Pro: הפעלה של HDR ו-60 FPS בו-זמנית
במכשיר ישן יותר שבו אי אפשר להפעיל HDR ו-60 FPS בו-זמנית, רק HDR מופעל והאפשרות 60 FPS מושבתת.
Feature Group API מאפשר לכם:
- יצירת ממשקי משתמש דינמיים וחכמים יותר: הפעלה או השבתה של הגדרות בממשק המשתמש בצורה חכמה על סמך תמיכה בחומרה בזמן אמת. לדוגמה, אם משתמש מפעיל HDR, אתם יכולים להשבית את האפשרות 60 FPS באופן מיידי אם השילוב הזה לא נתמך במכשיר.
- הפעלת מצב 'איכות גבוהה' מהימן: הגדרת המצלמה עם רשימה של התכונות הרצויות לפי סדר עדיפות. 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 מפעיל באופן אוטומטי את השילוב עם העדיפות הכי גבוהה שהמכשיר תומך בו.
-
-
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 פריימים לשנייה
- 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, אבל הוא לא מלוטש מספיק לשימוש בסביבת ייצור.
מתחילים עוד היום
ה-API של קבוצת התכונות מסיר את העמימות שקיימת בעבודה עם יכולות מתקדמות של המצלמה. התכונה הזו מספקת דרך דטרמיניסטית לשאילתות לגבי תמיכה בתכונות, כך שתוכלו ליצור אפליקציות מצלמה חזקות ואמינות יותר בביטחון.
ה-API זמין כניסיוני ב-CameraX 1.5, והוא צפוי להיות יציב לחלוטין בגרסה 1.6, עם תמיכה ושיפורים נוספים בדרך.
מידע נוסף זמין במסמכי התיעוד הרשמיים. אנחנו כבר ממש סקרנים לראות מה תיצרו, ונשמח לקבל מכם משוב. נשמח לשמוע את דעתך ולדווח על בעיות באמצעות הערוצים הבאים:
להמשך הקריאה
-
חדשות על מוצרים
Android 17 הגיע לגרסת בטא 4, גרסת הבטא המתוזמנת האחרונה של מחזור הפרסום הזה, אבן דרך קריטית לתאימות אפליקציות ויציבות הפלטפורמה.
Daniel Galpin • משך הקריאה: 4 דקות
-
חדשות על מוצרים
הפיכת Google Play לחוויה הכי בטוחה ומהימנה שאפשר. היום אנחנו מכריזים על סדרה חדשה של עדכוני מדיניות ועל תכונה להעברת חשבון, במטרה לשפר את פרטיות המשתמשים ולהגן על העסק שלכם מפני הונאות.
Bennet Manuel • משך הקריאה: 3 דקות
-
חדשות על מוצרים
עכשיו קל יותר מתמיד לבדוק אינטראקציות בין מכשירים באמצעות אמולטור Android.
Steven Jenkins • משך הקריאה: 2 דקות
כדאי תמיד להיות בעניינים
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?