CameraX מספקת תוספים API לגישה לתוספים שיצרני המכשירים הטמיעו במכשירי Android שונים. במאמר תוספי מצלמה תוכלו למצוא רשימה של מצבי התוספים הנתמכים.
רשימה של מכשירים שתומכים בתוספים מופיעה ברשימה מכשירים נתמכים.
ארכיטקטורת תוספים
בתמונה הזו מוצגת הארכיטקטורה של תוספי המצלמה.
![](https://developer.android.com/static/images/training/camera/camerax/camerax-camera-extensions-architecture.png?hl=he)
אפליקציית CameraX יכולה להשתמש בתוספים באמצעות API של CameraX extensions. CameraX extensions API מנהל שאילתות לגבי תוספים זמינים, ומגדיר הרחבת סשן המצלמה והתקשורת עם ה-OEM של ה-OEM של התוספים למצלמה לספרייה. זה מאפשר לאפליקציה להשתמש ביכולות כמו לילה, HDR, אוטומטי, בוקה או ריטוש פנים.
הפעלת תוסף לצילום תמונות ותצוגה מקדימה
לפני שמשתמשים ב-API של התוספים, צריך לאחזר מופע של ExtensionsManager
באמצעות extensionsManager#getInstanceAsync(Context, CameraProvider)
. כך אפשר לבדוק את זמינות התוסף
מידע. לאחר מכן, ניתן לאחזר תוסף שהופעל CameraSelector
.
מצב התוסף יופעל בתרחישים לדוגמה של צילום תמונה ותצוגה מקדימה, כאשר
קריאה ל-bindToLifecycle()
שבהם התוסף CameraSelector
מופעל.
כדי להטמיע את התוסף לתרחישים לדוגמה של צילום תמונות ותצוגה מקדימה, כדאי לעיין בדוגמת הקוד הבאה:
Kotlin
import androidx.camera.extensions.ExtensionMode import androidx.camera.extensions.ExtensionsManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val lifecycleOwner = this val cameraProviderFuture = ProcessCameraProvider.getInstance(applicationContext) cameraProviderFuture.addListener({ // Obtain an instance of a process camera provider // The camera provider provides access to the set of cameras associated with the device. // The camera obtained from the provider will be bound to the activity lifecycle. val cameraProvider = cameraProviderFuture.get() val extensionsManagerFuture = ExtensionsManager.getInstanceAsync(applicationContext, cameraProvider) extensionsManagerFuture.addListener({ // Obtain an instance of the extensions manager // The extensions manager enables a camera to use extension capabilities available on // the device. val extensionsManager = extensionsManagerFuture.get() // Select the camera val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA // Query if extension is available. // Not all devices will support extensions or might only support a subset of // extensions. if (extensionsManager.isExtensionAvailable(cameraSelector, ExtensionMode.NIGHT)) { // Unbind all use cases before enabling different extension modes. try { cameraProvider.unbindAll() // Retrieve a night extension enabled camera selector val nightCameraSelector = extensionsManager.getExtensionEnabledCameraSelector( cameraSelector, ExtensionMode.NIGHT ) // Bind image capture and preview use cases with the extension enabled camera // selector. val imageCapture = ImageCapture.Builder().build() val preview = Preview.Builder().build() // Connect the preview to receive the surface the camera outputs the frames // to. This will allow displaying the camera frames in either a TextureView // or SurfaceView. The SurfaceProvider can be obtained from the PreviewView. preview.setSurfaceProvider(surfaceProvider) // Returns an instance of the camera bound to the lifecycle // Use this camera object to control various operations with the camera // Example: flash, zoom, focus metering etc. val camera = cameraProvider.bindToLifecycle( lifecycleOwner, nightCameraSelector, imageCapture, preview ) } catch (e: Exception) { Log.e(TAG, "Use case binding failed", e) } } }, ContextCompat.getMainExecutor(this)) }, ContextCompat.getMainExecutor(this)) }
Java
import androidx.camera.extensions.ExtensionMode; import androidx.camera.extensions.ExtensionsManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final LifecycleOwner lifecycleOwner = this; final ListenableFuturecameraProviderFuture = ProcessCameraProvider.getInstance(getApplicationContext()); cameraProviderFuture.addListener(() -> { try { // Obtain an instance of a process camera provider // The camera provider provides access to the set of cameras associated with the // device. The camera obtained from the provider will be bound to the activity // lifecycle. final ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); final ListenableFuture extensionsManagerFuture = ExtensionsManager.getInstanceAsync(getApplicationContext(), cameraProvider); extensionsManagerFuture.addListener(() -> { // Obtain an instance of the extensions manager // The extensions manager enables a camera to use extension capabilities available // on the device. try { final ExtensionsManager extensionsManager = extensionsManagerFuture.get(); // Select the camera final CameraSelector cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA; // Query if extension is available. // Not all devices will support extensions or might only support a subset of // extensions. if (extensionsManager.isExtensionAvailable( cameraSelector, ExtensionMode.NIGHT )) { // Unbind all use cases before enabling different extension modes. cameraProvider.unbindAll(); // Retrieve extension enabled camera selector final CameraSelector nightCameraSelector = extensionsManager .getExtensionEnabledCameraSelector(cameraSelector, ExtensionMode.NIGHT); // Bind image capture and preview use cases with the extension enabled camera // selector. final ImageCapture imageCapture = new ImageCapture.Builder().build(); final Preview preview = new Preview.Builder().build(); // Connect the preview to receive the surface the camera outputs the frames // to. This will allow displaying the camera frames in either a TextureView // or SurfaceView. The SurfaceProvider can be obtained from the PreviewView. preview.setSurfaceProvider(surfaceProvider); cameraProvider.bindToLifecycle( lifecycleOwner, nightCameraSelector, imageCapture, preview ); } } catch (ExecutionException | InterruptedException e) { throw new RuntimeException(e); } }, ContextCompat.getMainExecutor(this)); } catch (ExecutionException | InterruptedException e) { throw new RuntimeException(e); } }, ContextCompat.getMainExecutor(this)); }
השבתת התוסף
כדי להשבית תוספי ספקים, צריך לבטל את הקישור של כל התרחישים לדוגמה ולקשר מחדש את צילום התמונה
ולצפות בתצוגה מקדימה של תרחישים לדוגמה עם בורר מצלמה רגיל. לדוגמה, קישור מחדש אל
מצלמה אחורית באמצעות CameraSelector.DEFAULT_BACK_CAMERA
.
יחסי תלות
התוסף CameraX API מוטמע בספרייה camera-extensions
.
התוספים תלויים במודולים של הליבה של CameraX (core
, camera2
,
lifecycle
).
מגניב
dependencies { def camerax_version = "1.2.0-rc01" implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" implementation "androidx.camera:camera-lifecycle:${camerax_version}" //the CameraX Extensions library implementation "androidx.camera:camera-extensions:${camerax_version}" ... }
Kotlin
dependencies { val camerax_version = "1.2.0-rc01" implementation("androidx.camera:camera-core:${camerax_version}") implementation("androidx.camera:camera-camera2:${camerax_version}") implementation("androidx.camera:camera-lifecycle:${camerax_version}") // the CameraX Extensions library implementation("androidx.camera:camera-extensions:${camerax_version}") ... }
הסרה של API מדור קודם
עם ה-API החדש לתוספים שיצא ב-1.0.0-alpha26
, הגרסה הקודמת
ממשקי ה-API של התוספים שהושקו באוגוסט 2019 הוצאו משימוש. מתחיל ב-
בגרסה 1.0.0-alpha28
, ה-API הקודם של התוספים הוסר
לספרייה. אפליקציות שמשתמשות ב-API החדש לתוספים חייבות עכשיו להשיג
עם תוסף CameraSelector
ולהשתמש בו כדי לקשר בין התרחישים לדוגמה.
אפליקציות שמשתמשות בממשק ה-API הקודם של תוספים צריכות לעבור לממשק החדש ממשק API לתוספים כדי להבטיח תאימות עתידית ל- CameraX שיושק בקרוב גרסאות חדשות.
מקורות מידע נוספים
למידע נוסף על CameraX, ניתן לעיין במשאבים הנוספים הבאים.
Codelab
דוגמת קוד
אפליקציה לדוגמה של תוספי CameraX
הפניות אחרות
כלי לאימות תוספי ספק של CameraX