این صفحه معماری CameraX، از جمله ساختار آن، نحوه کار با API، نحوه کار با چرخه های عمر و نحوه ترکیب موارد استفاده را پوشش می دهد.
ساختار CameraX
شما می توانید از CameraX برای ارتباط با دوربین دستگاه از طریق انتزاعی به نام مورد استفاده استفاده کنید. موارد استفاده زیر موجود است:
- پیشنمایش : سطحی را برای نمایش پیشنمایش میپذیرد، مانند
PreviewView
. - تجزیه و تحلیل تصویر : بافرهای قابل دسترسی CPU را برای تجزیه و تحلیل، مانند یادگیری ماشین، فراهم می کند.
- ضبط تصویر : عکسی را می گیرد و ذخیره می کند.
- ضبط ویدیو : ضبط ویدیو و صدا با
VideoCapture
موارد استفاده را می توان همزمان ترکیب و فعال کرد. برای مثال، یک برنامه میتواند به کاربر اجازه دهد تصویری را که دوربین میبیند با استفاده از یک مورد استفاده پیشنمایش مشاهده کند، یک مورد استفاده از تجزیه و تحلیل تصویر داشته باشد که تعیین میکند افراد در عکس لبخند میزنند یا خیر، و شامل یک مورد استفاده از عکسبرداری برای گرفتن عکس باشد. زمانی که آنها هستند.
مدل API
برای کار با کتابخانه موارد زیر را مشخص کنید:
- مورد استفاده مورد نظر با گزینه های پیکربندی.
- با پیوست کردن شنوندگان با داده های خروجی چه کنیم؟
- جریان مورد نظر، مانند زمان فعال کردن دوربینها و زمان تولید داده، با اتصال مورد استفاده به چرخههای عمر معماری Android .
2 راه برای نوشتن یک برنامه CameraX وجود دارد: CameraController
(در صورتی که ساده ترین راه برای استفاده از CameraX را می خواهید عالی است) یا CameraProvider
(در صورتی که به انعطاف پذیری بیشتری نیاز دارید عالی است).
دوربین کنترلر
یک CameraController
بیشتر عملکردهای اصلی CameraX را در یک کلاس ارائه می دهد. به کد راهاندازی کمی نیاز دارد، و بهطور خودکار راهاندازی اولیه دوربین، مدیریت استفاده از کیس، چرخش هدف، ضربه زدن به فوکوس، نزدیک کردن به زوم و موارد دیگر را کنترل میکند. کلاس بتنی که CameraController
را گسترش می دهد LifecycleCameraController
است.
کاتلین
val previewView: PreviewView = viewBinding.previewView var cameraController = LifecycleCameraController(baseContext) cameraController.bindToLifecycle(this) cameraController.cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA previewView.controller = cameraController
جاوا
PreviewView previewView = viewBinding.previewView; LifecycleCameraController cameraController = new LifecycleCameraController(baseContext); cameraController.bindToLifecycle(this); cameraController.setCameraSelector(CameraSelector.DEFAULT_BACK_CAMERA); previewView.setController(cameraController);
UseCase
های پیش فرض برای CameraController
عبارتند از Preview
, ImageCapture
و ImageAnalysis
. برای خاموش کردن ImageCapture
یا ImageAnalysis
یا روشن کردن VideoCapture
، از متد setEnabledUseCases()
استفاده کنید.
برای استفاده بیشتر از CameraController
، به نمونه اسکنر کد QR یا ویدیوی اصولی CameraController
مراجعه کنید.
Camera Provider
استفاده از CameraProvider
هنوز آسان است، اما از آنجایی که توسعهدهنده برنامه بیشتر تنظیمات را انجام میدهد، فرصتهای بیشتری برای سفارشی کردن پیکربندی وجود دارد، مانند فعال کردن چرخش تصویر خروجی یا تنظیم قالب تصویر خروجی در ImageAnalysis
. همچنین میتوانید از یک Surface
سفارشی برای پیشنمایش دوربین استفاده کنید، در حالی که با CameraController باید از PreviewView
استفاده کنید. استفاده از کد Surface
موجود میتواند مفید باشد اگر از قبل ورودی به قسمتهای دیگر برنامه شما باشد.
شما موارد استفاده را با استفاده از متدهای set()
پیکربندی می کنید و با متد build()
نهایی می کنید. هر شیء مورد استفاده مجموعه ای از APIهای مورد خاص را ارائه می دهد. به عنوان مثال، مورد استفاده از عکس گرفتن یک فراخوانی متد takePicture()
ارائه می کند.
به جای اینکه یک برنامه فراخوانی روش شروع و توقف خاصی را در onResume()
و onPause()
قرار دهد، برنامه با استفاده از cameraProvider.bindToLifecycle()
یک چرخه حیات را برای مرتبط کردن دوربین با آن مشخص می کند. سپس آن چرخه عمر به CameraX اطلاع میدهد که چه زمانی جلسه عکاسی دوربین را پیکربندی کند و اطمینان حاصل میکند که وضعیت دوربین به طور مناسب برای مطابقت با انتقال چرخه عمر تغییر میکند.
برای مراحل پیادهسازی برای هر مورد، به اجرای پیشنمایش ، تجزیه و تحلیل تصاویر ، ضبط تصویر و ضبط ویدیو مراجعه کنید.
مورد استفاده پیشنمایش با یک Surface
برای نمایش در تعامل است. برنامه ها با استفاده از کد زیر، مورد استفاده را با گزینه های پیکربندی ایجاد می کنند:
کاتلین
val preview = Preview.Builder().build() val viewFinder: PreviewView = findViewById(R.id.previewView) // The use case is bound to an Android Lifecycle with the following code val camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview) // PreviewView creates a surface provider and is the recommended provider preview.setSurfaceProvider(viewFinder.getSurfaceProvider())
جاوا
Preview preview = new Preview.Builder().build(); PreviewView viewFinder = findViewById(R.id.view_finder); // The use case is bound to an Android Lifecycle with the following code Camera camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview); // PreviewView creates a surface provider, using a Surface from a different // kind of view will require you to implement your own surface provider. preview.previewSurfaceProvider = viewFinder.getSurfaceProvider();
برای نمونه کد بیشتر، به برنامه رسمی CameraX نمونه مراجعه کنید.
چرخه های عمر CameraX
CameraX یک چرخه حیات را برای تعیین زمان باز کردن دوربین، زمان ایجاد یک جلسه عکسبرداری و زمان توقف و خاموش شدن مشاهده می کند. از APIهای مورد استفاده، فراخوانی روش و تماسهای برگشتی را برای نظارت بر پیشرفت ارائه میدهند.
همانطور که در Combine use case توضیح داده شد، میتوانید ترکیبی از موارد استفاده را به یک چرخه عمر متصل کنید. هنگامی که برنامه شما نیاز به پشتیبانی از موارد استفاده دارد که قابل ترکیب نیستند، می توانید یکی از موارد زیر را انجام دهید:
- موارد استفاده سازگار را با هم در بیش از یک قطعه گروه بندی کنید و سپس بین قطعات سوئیچ کنید
- یک جزء چرخه عمر سفارشی ایجاد کنید و از آن برای کنترل دستی چرخه عمر دوربین استفاده کنید
اگر نمای خود و صاحبان چرخه استفاده از دوربین را جدا کنید (به عنوان مثال، اگر از یک چرخه عمر سفارشی یا یک قطعه نگهدارنده استفاده می کنید)، باید اطمینان حاصل کنید که همه موارد استفاده از CameraX با استفاده از ProcessCameraProvider.unbindAll()
یا با unbinding خارج می شوند. هر مورد به صورت جداگانه از طرف دیگر، هنگامی که موارد استفاده را به یک چرخه زندگی متصل میکنید، میتوانید به CameraX اجازه دهید باز و بسته کردن جلسه ضبط و جدا کردن موارد استفاده را مدیریت کند.
اگر تمام عملکرد دوربین شما با چرخه عمر یک جزء آگاه از چرخه حیات مانند یک AppCompatActivity
یا یک قطعه AppCompat
مطابقت دارد، استفاده از چرخه عمر آن مؤلفه هنگام اتصال همه موارد استفاده مورد نظر، اطمینان حاصل می کند که عملکرد دوربین در زمانی که جزء آگاه از چرخه حیات فعال است، و به طور ایمن دفع می شود، در غیر این صورت هیچ منبعی مصرف نمی کند.
صاحبان چرخه زندگی سفارشی
برای موارد پیشرفته، میتوانید یک LifecycleOwner
سفارشی ایجاد کنید تا برنامهتان را قادر میسازد تا چرخه عمر جلسه CameraX را بهجای گره زدن به LifecycleOwner
استاندارد Android، بهصراحت کنترل کند.
نمونه کد زیر نحوه ایجاد یک LifecycleOwner سفارشی ساده را نشان می دهد:
کاتلین
class CustomLifecycle : LifecycleOwner { private val lifecycleRegistry: LifecycleRegistry init { lifecycleRegistry = LifecycleRegistry(this); lifecycleRegistry.markState(Lifecycle.State.CREATED) } ... fun doOnResume() { lifecycleRegistry.markState(State.RESUMED) } ... override fun getLifecycle(): Lifecycle { return lifecycleRegistry } }
جاوا
public class CustomLifecycle implements LifecycleOwner { private LifecycleRegistry lifecycleRegistry; public CustomLifecycle() { lifecycleRegistry = new LifecycleRegistry(this); lifecycleRegistry.markState(Lifecycle.State.CREATED); } ... public void doOnResume() { lifecycleRegistry.markState(State.RESUMED); } ... public Lifecycle getLifecycle() { return lifecycleRegistry; } }
با استفاده از این LifecycleOwner
، برنامه شما می تواند انتقال حالت را در نقاط دلخواه در کد خود قرار دهد. برای اطلاعات بیشتر در مورد اجرای این قابلیت در برنامه خود، به پیاده سازی LifecycleOwner سفارشی مراجعه کنید.
موارد استفاده همزمان
موارد استفاده می توانند به صورت همزمان اجرا شوند. در حالی که موارد استفاده را می توان به صورت متوالی به یک چرخه زندگی متصل کرد، بهتر است همه موارد استفاده را با یک فراخوانی به CameraProcessProvider.bindToLifecycle()
پیوند داد. برای اطلاعات بیشتر در مورد بهترین روشها برای تغییرات پیکربندی، به کنترل تغییرات پیکربندی مراجعه کنید.
در نمونه کد زیر، اپلیکیشن دو مورد استفاده را مشخص میکند که باید همزمان ایجاد و اجرا شوند. همچنین چرخه عمر مورد استفاده برای هر دو مورد را مشخص می کند، به طوری که هر دو مطابق با چرخه عمر شروع و متوقف می شوند.
کاتلین
private lateinit var imageCapture: ImageCapture override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val cameraProviderFuture = ProcessCameraProvider.getInstance(this) cameraProviderFuture.addListener(Runnable { // Camera provider is now guaranteed to be available val cameraProvider = cameraProviderFuture.get() // Set up the preview use case to display camera preview. val preview = Preview.Builder().build() // Set up the capture use case to allow users to take photos. imageCapture = ImageCapture.Builder() .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) .build() // Choose the camera by requiring a lens facing val cameraSelector = CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_FRONT) .build() // Attach use cases to the camera with the same lifecycle owner val camera = cameraProvider.bindToLifecycle( this as LifecycleOwner, cameraSelector, preview, imageCapture) // Connect the preview use case to the previewView preview.setSurfaceProvider( previewView.getSurfaceProvider()) }, ContextCompat.getMainExecutor(this)) }
جاوا
private ImageCapture imageCapture; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); PreviewView previewView = findViewById(R.id.previewView); ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this); cameraProviderFuture.addListener(() -> { try { // Camera provider is now guaranteed to be available ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); // Set up the view finder use case to display camera preview Preview preview = new Preview.Builder().build(); // Set up the capture use case to allow users to take photos imageCapture = new ImageCapture.Builder() .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) .build(); // Choose the camera by requiring a lens facing CameraSelector cameraSelector = new CameraSelector.Builder() .requireLensFacing(lensFacing) .build(); // Attach use cases to the camera with the same lifecycle owner Camera camera = cameraProvider.bindToLifecycle( ((LifecycleOwner) this), cameraSelector, preview, imageCapture); // Connect the preview use case to the previewView preview.setSurfaceProvider( previewView.getSurfaceProvider()); } catch (InterruptedException | ExecutionException e) { // Currently no exceptions thrown. cameraProviderFuture.get() // shouldn't block since the listener is being called, so no need to // handle InterruptedException. } }, ContextCompat.getMainExecutor(this)); }
ترکیبهای پیکربندی زیر تضمین میشوند که پشتیبانی میشوند (در صورت نیاز به پیشنمایش یا ضبط ویدیو، اما نه هر دو به طور همزمان):
پیش نمایش یا فیلمبرداری | ضبط تصویر | تجزیه و تحلیل | توضیحات |
---|---|---|---|
پیش نمایش یا ضبط ویدیو، عکس گرفتن و تجزیه و تحلیل جریان تصویر را به کاربر ارائه دهید. | |||
عکس بگیرید و جریان تصویر را تجزیه و تحلیل کنید. | |||
یک پیش نمایش یا ضبط ویدیو به کاربر ارائه دهید و یک عکس بگیرید. | |||
پیش نمایش یا ضبط ویدیو را به کاربر ارائه دهید و جریان تصویر را تجزیه و تحلیل کنید. |
هنگامی که هر دو پیشنمایش و ضبط ویدیو مورد نیاز است، ترکیبهای مورد استفاده زیر به صورت مشروط پشتیبانی میشوند:
پیش نمایش | ضبط ویدیو | ضبط تصویر | تجزیه و تحلیل | نیاز ویژه |
---|---|---|---|---|
تضمینی برای تمامی دوربین ها | ||||
دستگاه دوربین محدود (یا بهتر). | ||||
دستگاه دوربین LEVEL_3 (یا بهتر). |
علاوه بر این،
- هر مورد استفاده می تواند به تنهایی کار کند. به عنوان مثال، یک برنامه می تواند بدون استفاده از پیش نمایش فیلم ضبط کند.
- وقتی برنامههای افزودنی فعال هستند، فقط ترکیب
ImageCapture
وPreview
تضمین میشود که کار کنند. بسته به اجرای OEM، ممکن است امکان افزودنImageAnalysis
وجود نداشته باشد. برنامه های افزودنی را نمی توان برای مورد استفادهVideoCapture
فعال کرد. برای جزئیات ، سند مرجع برنامه افزودنی را بررسی کنید. - بسته به قابلیت دوربین، برخی از دوربینها ممکن است از ترکیب در حالتهای وضوح پایینتر پشتیبانی کنند، اما نمیتوانند از ترکیب مشابه در برخی وضوحهای بالاتر پشتیبانی کنند.
سطح سخت افزار پشتیبانی شده را می توان از Camera2CameraInfo
بازیابی کرد. برای مثال، کد زیر بررسی میکند که آیا دوربین پیشفرض پشت دستگاه LEVEL_3
است یا خیر:
کاتلین
@androidx.annotation.OptIn(ExperimentalCamera2Interop::class) fun isBackCameraLevel3Device(cameraProvider: ProcessCameraProvider) : Boolean { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { return CameraSelector.DEFAULT_BACK_CAMERA .filter(cameraProvider.availableCameraInfos) .firstOrNull() ?.let { Camera2CameraInfo.from(it) } ?.getCameraCharacteristic(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3 } return false }
جاوا
@androidx.annotation.OptIn(markerClass = ExperimentalCamera2Interop.class) Boolean isBackCameraLevel3Device(ProcessCameraProvider cameraProvider) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { List\<CameraInfo\> filteredCameraInfos = CameraSelector.DEFAULT_BACK_CAMERA .filter(cameraProvider.getAvailableCameraInfos()); if (!filteredCameraInfos.isEmpty()) { return Objects.equals( Camera2CameraInfo.from(filteredCameraInfos.get(0)).getCameraCharacteristic( CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL), CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_3); } } return false; }
مجوزها
برنامه شما به مجوز CAMERA
نیاز دارد. برای ذخیره تصاویر در فایلها، به مجوز WRITE_EXTERNAL_STORAGE
نیز نیاز است، مگر در دستگاههایی که Android نسخه ۱۰ یا بالاتر دارند.
برای اطلاعات بیشتر درباره پیکربندی مجوزها برای برنامه خود، درخواست مجوزهای برنامه را بخوانید.
الزامات
CameraX دارای حداقل نسخه مورد نیاز زیر است:
- Android API سطح 21
- اجزای معماری اندروید 1.1.1
برای فعالیتهای آگاه از چرخه حیات، از FragmentActivity
یا AppCompatActivity
استفاده کنید.
وابستگی ها را اعلام کنید
برای افزودن وابستگی به CameraX، باید مخزن Google Maven را به پروژه خود اضافه کنید.
فایل settings.gradle
را برای پروژه خود باز کنید و مخزن google()
را همانطور که در زیر نشان داده شده است اضافه کنید:
شیار
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
کاتلین
dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } }
موارد زیر را به انتهای بلوک اندروید اضافه کنید:
شیار
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
کاتلین
android { compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } // For Kotlin projects kotlinOptions { jvmTarget = "1.8" } }
موارد زیر را به فایل build.gradle
هر ماژول برای یک برنامه اضافه کنید:
شیار
dependencies { // CameraX core library using the camera2 implementation def camerax_version = "1.4.0-rc01" // The following line is optional, as the core library is included indirectly by camera-camera2 implementation "androidx.camera:camera-core:${camerax_version}" implementation "androidx.camera:camera-camera2:${camerax_version}" // If you want to additionally use the CameraX Lifecycle library implementation "androidx.camera:camera-lifecycle:${camerax_version}" // If you want to additionally use the CameraX VideoCapture library implementation "androidx.camera:camera-video:${camerax_version}" // If you want to additionally use the CameraX View class implementation "androidx.camera:camera-view:${camerax_version}" // If you want to additionally add CameraX ML Kit Vision Integration implementation "androidx.camera:camera-mlkit-vision:${camerax_version}" // If you want to additionally use the CameraX Extensions library implementation "androidx.camera:camera-extensions:${camerax_version}" }
کاتلین
dependencies { // CameraX core library using the camera2 implementation val camerax_version = "1.4.0-rc01" // The following line is optional, as the core library is included indirectly by camera-camera2 implementation("androidx.camera:camera-core:${camerax_version}") implementation("androidx.camera:camera-camera2:${camerax_version}") // If you want to additionally use the CameraX Lifecycle library implementation("androidx.camera:camera-lifecycle:${camerax_version}") // If you want to additionally use the CameraX VideoCapture library implementation("androidx.camera:camera-video:${camerax_version}") // If you want to additionally use the CameraX View class implementation("androidx.camera:camera-view:${camerax_version}") // If you want to additionally add CameraX ML Kit Vision Integration implementation("androidx.camera:camera-mlkit-vision:${camerax_version}") // If you want to additionally use the CameraX Extensions library implementation("androidx.camera:camera-extensions:${camerax_version}") }
برای اطلاعات بیشتر در مورد پیکربندی برنامه خود برای مطابقت با این الزامات، به اعلام وابستگی ها مراجعه کنید.
قابلیت همکاری CameraX با Camera2
CameraX بر روی Camera2 ساخته شده است و CameraX راههایی برای خواندن و حتی نوشتن ویژگیها در اجرای Camera2 را نشان میدهد. برای جزئیات کامل، بسته Interop را ببینید.
برای اطلاعات بیشتر در مورد اینکه CameraX چگونه ویژگیهای Camera2 را پیکربندی کرده است، از Camera2CameraInfo
برای خواندن CameraCharacteristics
اصلی استفاده کنید. همچنین میتوانید ویژگیهای Camera2 را در یکی از دو مسیر زیر بنویسید:
از
Camera2CameraControl
استفاده کنید، که به شما امکان میدهد ویژگیهایCaptureRequest
زیرین، مانند حالت فوکوس خودکار را تنظیم کنید.یک CameraX
UseCase
باCamera2Interop.Extender
گسترش دهید. این به شما امکان میدهد ویژگیهای CaptureRequest را درست مانندCamera2CameraControl
تنظیم کنید. همچنین برخی از کنترلهای اضافی را به شما میدهد، مانند تنظیم حالت استفاده از جریان برای بهینهسازی دوربین برای سناریوی استفاده شما. برای اطلاعات، به استفاده از موارد استفاده جریانی برای عملکرد بهتر مراجعه کنید.
نمونه کد زیر از موارد استفاده از جریان برای بهینه سازی تماس ویدیویی استفاده می کند. از Camera2CameraInfo
برای واکشی که آیا مورد استفاده جریان تماس ویدیویی در دسترس است استفاده کنید. سپس، از Camera2Interop.Extender
برای تنظیم مورد استفاده جریان اصلی استفاده کنید.
کاتلین
// Set underlying Camera2 stream use case to optimize for video calls. val videoCallStreamId = CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL.toLong() // Check available CameraInfos to find the first one that supports // the video call stream use case. val frontCameraInfo = cameraProvider.getAvailableCameraInfos() .first { cameraInfo -> val isVideoCallStreamingSupported = Camera2CameraInfo.from(cameraInfo) .getCameraCharacteristic( CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES )?.contains(videoCallStreamId) val isFrontFacing = (cameraInfo.getLensFacing() == CameraSelector.LENS_FACING_FRONT) (isVideoCallStreamingSupported == true) && isFrontFacing } val cameraSelector = frontCameraInfo.cameraSelector // Start with a Preview Builder. val previewBuilder = Preview.Builder() .setTargetAspectRatio(screenAspectRatio) .setTargetRotation(rotation) // Use Camera2Interop.Extender to set the video call stream use case. Camera2Interop.Extender(previewBuilder).setStreamUseCase(videoCallStreamId) // Bind the Preview UseCase and the corresponding CameraSelector. val preview = previewBuilder.build() camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview)
جاوا
// Set underlying Camera2 stream use case to optimize for video calls. Long videoCallStreamId = CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL.toLong(); // Check available CameraInfos to find the first one that supports // the video call stream use case. List<CameraInfo> cameraInfos = cameraProvider.getAvailableCameraInfos(); CameraInfo frontCameraInfo = null; for (cameraInfo in cameraInfos) { Long[] availableStreamUseCases = Camera2CameraInfo.from(cameraInfo) .getCameraCharacteristic( CameraCharacteristics.SCALER_AVAILABLE_STREAM_USE_CASES ); boolean isVideoCallStreamingSupported = Arrays.List(availableStreamUseCases) .contains(videoCallStreamId); boolean isFrontFacing = (cameraInfo.getLensFacing() == CameraSelector.LENS_FACING_FRONT); if (isVideoCallStreamingSupported && isFrontFacing) { frontCameraInfo = cameraInfo; } } if (frontCameraInfo == null) { // Handle case where video call streaming is not supported. } CameraSelector cameraSelector = frontCameraInfo.getCameraSelector(); // Start with a Preview Builder. Preview.Builder previewBuilder = Preview.Builder() .setTargetAspectRatio(screenAspectRatio) .setTargetRotation(rotation); // Use Camera2Interop.Extender to set the video call stream use case. Camera2Interop.Extender(previewBuilder).setStreamUseCase(videoCallStreamId); // Bind the Preview UseCase and the corresponding CameraSelector. Preview preview = previewBuilder.build() Camera camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview)
منابع اضافی
برای کسب اطلاعات بیشتر در مورد CameraX، به منابع اضافی زیر مراجعه کنید.