این صفحه معماری CameraX، از جمله ساختار آن، نحوه کار با API، نحوه کار با چرخههای حیات و نحوه ترکیب موارد استفاده را پوشش میدهد.
ساختار CameraX
شما میتوانید از CameraX برای ارتباط با دوربین یک دستگاه از طریق انتزاعی به نام مورد استفاده استفاده کنید. موارد استفاده زیر در دسترس هستند:
- پیشنمایش : سطحی را برای نمایش پیشنمایش میپذیرد، مانند
PreviewView
. - تحلیل تصویر : بافرهایی را برای تحلیلهایی مانند یادگیری ماشینی که توسط CPU قابل دسترسی هستند، فراهم میکند.
- ضبط تصویر : عکسی را ثبت و ذخیره میکند.
- ضبط ویدیو : ضبط ویدیو و صدا با
VideoCapture
موارد استفاده میتوانند با هم ترکیب شده و همزمان فعال باشند. برای مثال، یک برنامه میتواند به کاربر اجازه دهد تصویری را که دوربین میبیند با استفاده از یک مورد استفاده پیشنمایش مشاهده کند، یک مورد استفاده تجزیه و تحلیل تصویر داشته باشد که مشخص میکند آیا افراد در عکس لبخند میزنند یا خیر، و یک مورد استفاده ضبط تصویر را برای گرفتن عکس پس از لبخند زدن آنها در نظر بگیرد.
مدل API
برای کار با کتابخانه، موارد زیر را مشخص میکنید:
- مورد استفاده مورد نظر به همراه گزینههای پیکربندی.
- با اتصال شنوندهها، با دادههای خروجی چه کار کنیم.
- جریان مورد نظر، مانند زمان فعال کردن دوربینها و زمان تولید دادهها، با اتصال مورد استفاده به چرخههای حیات معماری اندروید .
دو راه برای نوشتن یک برنامه 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 Code یا ویدیوی اصول اولیه CameraController
مراجعه کنید.
ارائه دهنده دوربین
استفاده از 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های مورد استفاده، فراخوانیهای متد و فراخوانیهای برگشتی را برای نظارت بر پیشرفت ارائه میدهند.
همانطور که در بخش «ترکیب موارد استفاده» توضیح داده شد، میتوانید ترکیبی از موارد استفاده را به یک چرخه حیات واحد متصل کنید. وقتی برنامه شما نیاز به پشتیبانی از موارد استفادهای دارد که قابل ترکیب نیستند، میتوانید یکی از موارد زیر را انجام دهید:
- موارد استفاده سازگار را در بیش از یک قطعه گروهبندی کنید و سپس بین قطعات جابجا شوید
- یک کامپوننت چرخه عمر سفارشی ایجاد کنید و از آن برای کنترل دستی چرخه عمر دوربین استفاده کنید
اگر مالکان چرخه عمر موارد استفاده از view و camera را جدا کنید (برای مثال، اگر از یک چرخه عمر سفارشی یا یک قطعه retain استفاده میکنید)، باید مطمئن شوید که همه موارد استفاده با استفاده از ProcessCameraProvider.unbindAll()
یا با unbind کردن هر مورد استفاده به صورت جداگانه، از CameraX جدا شدهاند. از طرف دیگر، وقتی موارد استفاده را به یک Lifecycle متصل میکنید، میتوانید به CameraX اجازه دهید باز و بسته کردن جلسه ضبط و unbind کردن موارد استفاده را مدیریت کند.
اگر تمام قابلیتهای دوربین شما مربوط به چرخه حیات یک کامپوننت آگاه از چرخه حیات مانند AppCompatActivity
یا یک قطعه AppCompat
باشد، استفاده از چرخه حیات آن کامپوننت هنگام اتصال تمام موارد استفاده مورد نظر، تضمین میکند که عملکرد دوربین در هنگام فعال بودن کامپوننت آگاه از چرخه حیات آماده است و به طور ایمن از بین میرود و در غیر این صورت هیچ منبعی مصرف نمیکند.
مالکان چرخه عمر سفارشی
برای موارد پیشرفته، میتوانید یک LifecycleOwner
سفارشی ایجاد کنید تا برنامه شما بتواند چرخه عمر جلسه CameraX را به طور صریح کنترل کند، به جای اینکه آن را به یک LifecycleOwner
استاندارد اندروید متصل کند.
نمونه کد زیر نحوه ایجاد یک 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()
متصل کنید. برای اطلاعات بیشتر در مورد بهترین شیوهها برای تغییرات پیکربندی، به Handle configuration changes مراجعه کنید.
در نمونه کد زیر، برنامه دو مورد استفاده را که باید همزمان ایجاد و اجرا شوند، مشخص میکند. همچنین چرخه عمر مورد استفاده برای هر دو مورد استفاده را مشخص میکند، به طوری که هر دو طبق چرخه عمر شروع و متوقف شوند.
کاتلین
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)); }
CameraX امکان استفاده همزمان از یک نمونه از هر یک از Preview
، VideoCapture
، ImageAnalysis
و ImageCapture
را فراهم میکند. علاوه بر این،
- هر مورد استفاده میتواند به تنهایی کار کند. برای مثال، یک برنامه میتواند بدون استفاده از پیشنمایش، ویدیو ضبط کند.
- وقتی افزونهها فعال باشند، فقط ترکیب
ImageCapture
وPreview
تضمین میشود که کار کند. بسته به پیادهسازی OEM، ممکن است اضافه کردنImageAnalysis
نیز امکانپذیر نباشد؛ افزونهها را نمیتوان برای مورد استفادهVideoCapture
فعال کرد. برای جزئیات بیشتر، سند مرجع افزونهها را بررسی کنید. - بسته به قابلیت دوربین، برخی از دوربینها ممکن است از این ترکیب در حالتهای با وضوح پایینتر پشتیبانی کنند، اما نمیتوانند از همان ترکیب در برخی از وضوحهای بالاتر پشتیبانی کنند.
- در دستگاههایی با سطح سختافزار دوربین
FULL
یا پایینتر، ترکیبPreview
،VideoCapture
وImageCapture
یاImageAnalysis
ممکن است CameraX را مجبور کند جریانPRIV
دوربین را برایPreview
و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
نیز نیاز دارد، به جز در دستگاههایی که اندروید ۱۰ یا بالاتر دارند.
برای اطلاعات بیشتر در مورد پیکربندی مجوزها برای برنامه خود، درخواست مجوزهای برنامه را مطالعه کنید.
الزامات
CameraX حداقل نسخه مورد نیاز زیر را دارد:
- اندروید API سطح ۲۱
- اجزای معماری اندروید ۱.۱.۱
برای فعالیتهای آگاه از چرخه حیات، از 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.6.0-alpha01" // 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.6.0-alpha01" // 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 مراجعه کنید.
برای اطلاعات بیشتر در مورد نحوه پیکربندی ویژگیهای Camera2 توسط CameraX، از Camera2CameraInfo
برای خواندن CameraCharacteristics
استفاده کنید. همچنین میتوانید ویژگیهای Camera2 را در یکی از دو مسیر زیر بنویسید:
از
Camera2CameraControl
استفاده کنید، که به شما امکان میدهد ویژگیهایCaptureRequest
زیرین، مانند حالت فوکوس خودکار، را تنظیم کنید.یک
UseCase
به CameraX را با یکCamera2Interop.Extender
توسعه دهید. این به شما امکان میدهد ویژگیهای CaptureRequest را درست مانندCamera2CameraControl
تنظیم کنید. همچنین کنترلهای بیشتری مانند تنظیم مورد استفاده جریان برای بهینهسازی دوربین برای سناریوی استفاده شما را در اختیار شما قرار میدهد. برای اطلاعات بیشتر، برای عملکرد بهتر به Use Stream Use Cases مراجعه کنید.
نمونه کد زیر از موارد استفاده جریان برای بهینهسازی تماس ویدیویی استفاده میکند. از 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، به منابع اضافی زیر مراجعه کنید.