আপনি প্রতিটি CameraX ব্যবহারের কেস কনফিগার করেন যাতে ব্যবহারের কেসের ক্রিয়াকলাপের বিভিন্ন দিক নিয়ন্ত্রণ করা যায়।
উদাহরণস্বরূপ, ইমেজ ক্যাপচার ব্যবহারের ক্ষেত্রে, আপনি একটি লক্ষ্য আকৃতির অনুপাত এবং একটি ফ্ল্যাশ মোড সেট করতে পারেন। নিম্নলিখিত কোডটি একটি উদাহরণ দেখায়:
কোটলিন
val imageCapture = ImageCapture.Builder() .setFlashMode(...) .setTargetAspectRatio(...) .build()
জাভা
ImageCapture imageCapture = new ImageCapture.Builder() .setFlashMode(...) .setTargetAspectRatio(...) .build();
কনফিগারেশন বিকল্পগুলি ছাড়াও, কিছু ব্যবহারের ক্ষেত্রে API গুলি ব্যবহার কেস তৈরির পরে গতিশীলভাবে সেটিংস পরিবর্তন করতে পারে। পৃথক ব্যবহারের ক্ষেত্রে নির্দিষ্ট কনফিগারেশন সম্পর্কে তথ্যের জন্য, একটি পূর্বরূপ বাস্তবায়ন করুন , চিত্র বিশ্লেষণ করুন এবং চিত্র ক্যাপচার দেখুন।
CameraXConfig সম্পর্কে
 সহজতার জন্য, CameraX-এর ডিফল্ট কনফিগারেশন রয়েছে যেমন অভ্যন্তরীণ এক্সিকিউটর এবং হ্যান্ডলার যা বেশিরভাগ ব্যবহারের পরিস্থিতিতে উপযুক্ত। তবে, যদি আপনার অ্যাপ্লিকেশনের বিশেষ প্রয়োজনীয়তা থাকে বা সেই কনফিগারেশনগুলি কাস্টমাইজ করতে পছন্দ করে, তাহলে CameraXConfig হল সেই উদ্দেশ্যে ইন্টারফেস।
 CameraXConfig এর সাহায্যে, একটি অ্যাপ্লিকেশন নিম্নলিখিত কাজগুলি করতে পারে:
-  setAvailableCameraLimiter()দিয়ে স্টার্টআপ ল্যাটেন্সি অপ্টিমাইজ করুন।
-  setCameraExecutor()দিয়ে CameraX-এ অ্যাপ্লিকেশনের এক্সিকিউটর সরবরাহ করুন।
-  ডিফল্ট শিডিউলার হ্যান্ডলারটি setSchedulerHandler()দিয়ে প্রতিস্থাপন করুন।
-  setMinimumLoggingLevel()দিয়ে লগিং লেভেল পরিবর্তন করুন।
ব্যবহারের মডেল
 নিম্নলিখিত পদ্ধতিতে CameraXConfig ব্যবহার করার পদ্ধতি বর্ণনা করা হয়েছে:
-  আপনার কাস্টমাইজড কনফিগারেশন ব্যবহার করে একটি CameraXConfigঅবজেক্ট তৈরি করুন।
-  আপনার ApplicationএCameraXConfig.Providerইন্টারফেসটি প্রয়োগ করুন এবংgetCameraXConfig()এ আপনারCameraXConfigঅবজেক্টটি ফিরিয়ে দিন।
-  এখানে বর্ণিত পদ্ধতিতে আপনার AndroidManifest.xmlফাইলে আপনারApplicationক্লাস যোগ করুন।
উদাহরণস্বরূপ, নিম্নলিখিত কোড নমুনাটি কেবল ত্রুটি বার্তাগুলিতে CameraX লগিং সীমাবদ্ধ করে:
কোটলিন
class CameraApplication : Application(), CameraXConfig.Provider { override fun getCameraXConfig(): CameraXConfig { return CameraXConfig.Builder.fromConfig(Camera2Config.defaultConfig()) .setMinimumLoggingLevel(Log.ERROR).build() } }
 যদি আপনার অ্যাপ্লিকেশনটির CameraX কনফিগারেশন সেট করার পরে জানার প্রয়োজন হয়, তাহলে CameraXConfig অবজেক্টের একটি স্থানীয় কপি রাখুন।
ক্যামেরা লিমিটার
 ProcessCameraProvider.getInstance() এর প্রথম আমন্ত্রণের সময়, CameraX ডিভাইসে উপলব্ধ ক্যামেরাগুলির বৈশিষ্ট্যগুলি গণনা করে এবং জিজ্ঞাসা করে। যেহেতু CameraX-কে হার্ডওয়্যার উপাদানগুলির সাথে যোগাযোগ করতে হয়, তাই প্রতিটি ক্যামেরার জন্য এই প্রক্রিয়াটি খুব কম সময় নিতে পারে, বিশেষ করে নিম্নমানের ডিভাইসগুলিতে। যদি আপনার অ্যাপ্লিকেশনটি ডিভাইসে শুধুমাত্র নির্দিষ্ট ক্যামেরা ব্যবহার করে, যেমন ডিফল্ট ফ্রন্ট ক্যামেরা, তাহলে আপনি CameraX-কে অন্যান্য ক্যামেরা উপেক্ষা করার জন্য সেট করতে পারেন, যা আপনার অ্যাপ্লিকেশন ব্যবহার করা ক্যামেরাগুলির জন্য স্টার্টআপ ল্যাটেন্সি কমাতে পারে।
 যদি CameraSelector CameraXConfig.Builder.setAvailableCamerasLimiter() এ পাঠানো হয়, তাহলে CameraX এমন আচরণ করবে যেন সেই ক্যামেরাটি বিদ্যমান নেই। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি অ্যাপ্লিকেশনটিকে শুধুমাত্র ডিভাইসের ডিফল্ট ব্যাক ক্যামেরা ব্যবহার করতে সীমাবদ্ধ করে: 
কোটলিন
class MainApplication : Application(), CameraXConfig.Provider { override fun getCameraXConfig(): CameraXConfig { return CameraXConfig.Builder.fromConfig(Camera2Config.defaultConfig()) .setAvailableCamerasLimiter(CameraSelector.DEFAULT_BACK_CAMERA) .build() } }
থ্রেড
 CameraX যে প্ল্যাটফর্ম API গুলিতে তৈরি করা হয়, তার অনেকের ইন্টারপ্রসেস কমিউনিকেশন (IPC) ব্লক করার প্রয়োজন হয়, যার ফলে হার্ডওয়্যারের প্রতিক্রিয়া জানাতে কখনও কখনও শত শত মিলিসেকেন্ড সময় লাগে। এই কারণে, CameraX শুধুমাত্র ব্যাকগ্রাউন্ড থ্রেড থেকে এই API গুলিকে কল করে, যাতে মূল থ্রেডটি ব্লক না হয় এবং UI তরল থাকে। CameraX অভ্যন্তরীণভাবে এই ব্যাকগ্রাউন্ড থ্রেডগুলি পরিচালনা করে যাতে এই আচরণটি স্বচ্ছ দেখায়। তবে, কিছু অ্যাপ্লিকেশনের থ্রেডের কঠোর নিয়ন্ত্রণ প্রয়োজন। CameraXConfig একটি অ্যাপ্লিকেশনকে CameraXConfig.Builder.setCameraExecutor() এবং CameraXConfig.Builder.setSchedulerHandler() মাধ্যমে ব্যবহৃত ব্যাকগ্রাউন্ড থ্রেড সেট করতে দেয়।
ক্যামেরা এক্সিকিউটর
 ক্যামেরা এক্সিকিউটরটি সমস্ত অভ্যন্তরীণ ক্যামেরা প্ল্যাটফর্ম API কলের জন্য ব্যবহৃত হয়, সেইসাথে এই API গুলি থেকে কলব্যাকের জন্যও। CameraX এই কাজগুলি সম্পাদন করার জন্য একটি অভ্যন্তরীণ Executor বরাদ্দ এবং পরিচালনা করে। তবে, যদি আপনার অ্যাপ্লিকেশনের থ্রেডগুলির উপর আরও কঠোর নিয়ন্ত্রণের প্রয়োজন হয়, CameraXConfig.Builder.setCameraExecutor() ব্যবহার করুন।
শিডিউলার হ্যান্ডলার
 শিডিউলার হ্যান্ডলারটি নির্দিষ্ট বিরতিতে অভ্যন্তরীণ কাজগুলি নির্ধারণ করতে ব্যবহৃত হয়, যেমন ক্যামেরাটি উপলব্ধ না থাকলে পুনরায় খোলার চেষ্টা করা। এই হ্যান্ডলারটি কাজগুলি সম্পাদন করে না এবং কেবল ক্যামেরা এক্সিকিউটরের কাছে প্রেরণ করে। এটি কখনও কখনও লিগ্যাসি API প্ল্যাটফর্মগুলিতেও ব্যবহৃত হয় যেখানে কলব্যাকের জন্য একটি Handler প্রয়োজন হয়। এই ক্ষেত্রে, কলব্যাকগুলি এখনও সরাসরি ক্যামেরা এক্সিকিউটরের কাছে প্রেরণ করা হয়। CameraX এই কাজগুলি সম্পাদন করার জন্য একটি অভ্যন্তরীণ HandlerThread বরাদ্দ এবং পরিচালনা করে, তবে আপনি এটি CameraXConfig.Builder.setSchedulerHandler() দিয়ে ওভাররাইড করতে পারেন।
লগিং
CameraX লগিং অ্যাপ্লিকেশনগুলিকে লগক্যাট বার্তা ফিল্টার করতে দেয়, কারণ আপনার প্রোডাকশন কোডে ভার্বোজ বার্তা এড়ানো ভাল অভ্যাস হতে পারে। CameraX চারটি লগিং স্তর সমর্থন করে, সবচেয়ে ভার্বোজ থেকে সবচেয়ে গুরুতর পর্যন্ত:
-  Log.DEBUG(ডিফল্ট)
-  Log.INFO
-  Log.WARN
-  Log.ERROR
 এই লগ লেভেলগুলির বিস্তারিত বিবরণের জন্য Android লগ ডকুমেন্টেশন দেখুন। আপনার অ্যাপ্লিকেশনের জন্য উপযুক্ত লগিং লেভেল সেট করতে CameraXConfig.Builder.setMinimumLoggingLevel(int) ব্যবহার করুন।
স্বয়ংক্রিয় নির্বাচন
CameraX স্বয়ংক্রিয়ভাবে আপনার অ্যাপটি যে ডিভাইসে চলছে তার জন্য নির্দিষ্ট কার্যকারিতা প্রদান করে। উদাহরণস্বরূপ, যদি আপনি কোনও রেজোলিউশন নির্দিষ্ট না করেন, অথবা আপনার নির্দিষ্ট রেজোলিউশনটি অসমর্থিত হয়, তাহলে CameraX স্বয়ংক্রিয়ভাবে ব্যবহারের জন্য সর্বোত্তম রেজোলিউশন নির্ধারণ করে। এই সমস্ত কাজ লাইব্রেরি দ্বারা পরিচালিত হয়, যার ফলে আপনার ডিভাইস-নির্দিষ্ট কোড লেখার প্রয়োজন হয় না।
ক্যামেরাএক্সের লক্ষ্য হল একটি ক্যামেরা সেশন সফলভাবে শুরু করা। এর অর্থ হল ক্যামেরাএক্স ডিভাইসের ক্ষমতার উপর ভিত্তি করে রেজোলিউশন এবং আকৃতির অনুপাতের সাথে আপস করে। আপসটি ঘটতে পারে কারণ:
- ডিভাইসটি অনুরোধ করা রেজোলিউশন সমর্থন করে না।
- ডিভাইসটিতে সামঞ্জস্যের সমস্যা রয়েছে, যেমন লিগ্যাসি ডিভাইসগুলি সঠিকভাবে কাজ করার জন্য নির্দিষ্ট রেজোলিউশনের প্রয়োজন।
- কিছু ডিভাইসে, নির্দিষ্ট ফর্ম্যাটগুলি কেবলমাত্র নির্দিষ্ট আকৃতির অনুপাতের সাথে উপলব্ধ।
-  JPEG বা ভিডিও এনকোডিংয়ের জন্য ডিভাইসটিতে "নিকটতম mod16" পছন্দ করা হয়েছে। আরও তথ্যের জন্য, SCALER_STREAM_CONFIGURATION_MAPদেখুন।
যদিও CameraX সেশন তৈরি এবং পরিচালনা করে, তবুও আপনার কোডের ইউজ কেস আউটপুটে ফিরে আসা ছবির আকারগুলি সর্বদা পরীক্ষা করুন এবং সেই অনুযায়ী সামঞ্জস্য করুন।
ঘূর্ণন
ডিফল্টরূপে, ইউজ কেস তৈরির সময় ক্যামেরার ঘূর্ণন ডিফল্ট ডিসপ্লের ঘূর্ণনের সাথে মেলে সেট করা থাকে। এই ডিফল্ট ক্ষেত্রে, ক্যামেরাএক্স আউটপুট তৈরি করে যাতে অ্যাপটি প্রিভিউতে আপনি যা দেখতে চান তার সাথে মেলে। ইউজ কেস অবজেক্ট কনফিগার করার সময় বর্তমান ডিসপ্লে ওরিয়েন্টেশনে পাস করে অথবা তৈরি হওয়ার পরে গতিশীলভাবে মাল্টি-ডিসপ্লে ডিভাইসগুলিকে সমর্থন করার জন্য আপনি ঘূর্ণনকে একটি কাস্টম মানে পরিবর্তন করতে পারেন।
 আপনার অ্যাপ কনফিগারেশন সেটিংস ব্যবহার করে টার্গেট রোটেশন সেট করতে পারে। এরপর এটি ইউজ কেস API (যেমন ImageAnalysis.setTargetRotation() ) থেকে পদ্ধতি ব্যবহার করে রোটেশন সেটিংস আপডেট করতে পারে, এমনকি যখন লাইফসাইকেলটি চলমান অবস্থায় থাকে। অ্যাপটি পোর্ট্রেট মোডে লক করা থাকলে আপনি এটি ব্যবহার করতে পারেন—এবং তাই রোটেশনে কোনও পুনর্গঠন ঘটে না—তবে ফটো বা বিশ্লেষণ ব্যবহারের ক্ষেত্রে ডিভাইসের বর্তমান রোটেশন সম্পর্কে সচেতন থাকা প্রয়োজন। উদাহরণস্বরূপ, মুখ সনাক্তকরণের জন্য মুখগুলি সঠিকভাবে ওরিয়েন্টেড করার জন্য ঘূর্ণন সচেতনতার প্রয়োজন হতে পারে, অথবা ফটোগুলি ল্যান্ডস্কেপ বা পোর্ট্রেটে সেট করা হয়।
ক্যাপচার করা ছবির ডেটা ঘূর্ণন তথ্য ছাড়াই সংরক্ষণ করা হতে পারে। Exif ডেটাতে ঘূর্ণন তথ্য থাকে যাতে গ্যালারি অ্যাপ্লিকেশনগুলি সংরক্ষণের পরে ছবিটি সঠিক দিকনির্দেশনায় দেখাতে পারে।
 সঠিক ওরিয়েন্টেশন সহ প্রিভিউ ডেটা প্রদর্শনের জন্য, আপনি ট্রান্সফর্ম তৈরি করতে Preview.PreviewOutput() থেকে মেটাডেটা আউটপুট ব্যবহার করতে পারেন।
নিচের কোড নমুনাটি দেখায় কিভাবে একটি ওরিয়েন্টেশন ইভেন্টে ঘূর্ণন সেট করতে হয়:
কোটলিন
override fun onCreate() { val imageCapture = ImageCapture.Builder().build() val orientationEventListener = object : OrientationEventListener(this as Context) { override fun onOrientationChanged(orientation : Int) { // Monitors orientation values to determine the target rotation value val rotation : Int = when (orientation) { in 45..134 -> Surface.ROTATION_270 in 135..224 -> Surface.ROTATION_180 in 225..314 -> Surface.ROTATION_90 else -> Surface.ROTATION_0 } imageCapture.targetRotation = rotation } } orientationEventListener.enable() }
জাভা
@Override public void onCreate() { ImageCapture imageCapture = new ImageCapture.Builder().build(); OrientationEventListener orientationEventListener = new OrientationEventListener((Context)this) { @Override public void onOrientationChanged(int orientation) { int rotation; // Monitors orientation values to determine the target rotation value if (orientation >= 45 && orientation < 135) { rotation = Surface.ROTATION_270; } else if (orientation >= 135 && orientation < 225) { rotation = Surface.ROTATION_180; } else if (orientation >= 225 && orientation < 315) { rotation = Surface.ROTATION_90; } else { rotation = Surface.ROTATION_0; } imageCapture.setTargetRotation(rotation); } }; orientationEventListener.enable(); }
সেট ঘূর্ণনের উপর ভিত্তি করে, প্রতিটি ব্যবহারের ক্ষেত্রে হয় সরাসরি ছবির ডেটা ঘোরানো হয় অথবা অ-ঘূর্ণিত ছবির ডেটার গ্রাহকদের ঘূর্ণন মেটাডেটা প্রদান করা হয়।
-  প্রিভিউ : মেটাডেটা আউটপুট প্রদান করা হয় যাতে Preview.getTargetRotation()ব্যবহার করে লক্ষ্য রেজোলিউশনের ঘূর্ণন জানা যায়।
- ImageAnalysis : মেটাডেটা আউটপুট প্রদান করা হয় যাতে ডিসপ্লে স্থানাঙ্কের সাপেক্ষে চিত্র বাফার স্থানাঙ্কগুলি জানা যায়।
- ImageCapture : ঘূর্ণন সেটিং লক্ষ্য করার জন্য ইমেজ Exif মেটাডেটা, বাফার, অথবা বাফার এবং মেটাডেটা উভয়ই পরিবর্তন করা হয়। পরিবর্তিত মান HAL বাস্তবায়নের উপর নির্ভর করে।
আয়তক্ষেত্র কাটছাঁট করুন
 ডিফল্টরূপে, ক্রপ রেক্ট হল সম্পূর্ণ বাফার রেক্ট। আপনি এটি ViewPort এবং UseCaseGroup দিয়ে কাস্টমাইজ করতে পারেন। ব্যবহারের কেসগুলিকে গ্রুপ করে এবং ভিউপোর্ট সেট করে, CameraX গ্যারান্টি দেয় যে গ্রুপের সমস্ত ব্যবহারের কেসের ক্রপ রেক্টগুলি ক্যামেরা সেন্সরের একই অংশে নির্দেশ করবে।
নিম্নলিখিত কোড স্নিপেটটি দেখায় যে এই দুটি ক্লাস কীভাবে ব্যবহার করবেন:
কোটলিন
val viewPort = ViewPort.Builder(Rational(width, height), display.rotation).build() val useCaseGroup = UseCaseGroup.Builder() .addUseCase(preview) .addUseCase(imageAnalysis) .addUseCase(imageCapture) .setViewPort(viewPort) .build() cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCaseGroup)
জাভা
ViewPort viewPort = new ViewPort.Builder( new Rational(width, height), getDisplay().getRotation()).build(); UseCaseGroup useCaseGroup = new UseCaseGroup.Builder() .addUseCase(preview) .addUseCase(imageAnalysis) .addUseCase(imageCapture) .setViewPort(viewPort) .build(); cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCaseGroup);
 ViewPort ব্যবহারকারীদের কাছে দৃশ্যমান বাফার রেক্ট সংজ্ঞায়িত করে। তারপর ক্যামেরাএক্স ভিউপোর্টের বৈশিষ্ট্য এবং সংযুক্ত ব্যবহারের ক্ষেত্রের উপর ভিত্তি করে সম্ভাব্য বৃহত্তম ক্রপ রেক্ট গণনা করে। সাধারণত, WYSIWYG প্রভাব অর্জন করতে, আপনি প্রিভিউ ব্যবহারের ক্ষেত্রের উপর ভিত্তি করে ভিউপোর্ট কনফিগার করতে পারেন। ভিউপোর্ট পাওয়ার একটি সহজ উপায় হল PreviewView ব্যবহার করা।
 নিম্নলিখিত কোড স্নিপেটগুলি দেখায় কিভাবে ViewPort অবজেক্টটি পেতে হয়: 
কোটলিন
val viewport = findViewById<PreviewView>(R.id.preview_view).viewPort
জাভা
ViewPort viewPort = ((PreviewView)findViewById(R.id.preview_view)).getViewPort();
 পূর্ববর্তী উদাহরণে, ImageAnalysis এবং ImageCapture থেকে অ্যাপটি যা পায় তা PreviewView এ শেষ ব্যবহারকারী যা দেখে তার সাথে মিলে যায়, ধরে নিচ্ছি PreviewView এর স্কেল টাইপটি ডিফল্ট FILL_CENTER এ সেট করা আছে। আউটপুট বাফারে ক্রপ রেক্ট এবং রোটেশন প্রয়োগ করার পরে, সমস্ত ব্যবহারের ক্ষেত্রে চিত্রটি একই থাকে, যদিও সম্ভবত ভিন্ন রেজোলিউশনের সাথে। রূপান্তর তথ্য কীভাবে প্রয়োগ করবেন সে সম্পর্কে আরও তথ্যের জন্য, transform output দেখুন।
ক্যামেরা নির্বাচন
CameraX স্বয়ংক্রিয়ভাবে আপনার অ্যাপ্লিকেশনের প্রয়োজনীয়তা এবং ব্যবহারের ক্ষেত্রে সেরা ক্যামেরা ডিভাইসটি নির্বাচন করে। আপনি যদি আপনার জন্য নির্বাচিত ডিভাইসের চেয়ে ভিন্ন একটি ডিভাইস ব্যবহার করতে চান, তাহলে কয়েকটি বিকল্প রয়েছে:
-  CameraSelector.DEFAULT_FRONT_CAMERAদিয়ে ডিফল্ট ফ্রন্ট ফেসিং ক্যামেরার অনুরোধ করুন।
-  CameraSelector.DEFAULT_BACK_CAMERAদিয়ে ডিফল্ট রিয়ার ফেসিং ক্যামেরার অনুরোধ করুন।
-  CameraSelector.Builder.addCameraFilter()ব্যবহার করে উপলব্ধ ডিভাইসের তালিকা তাদেরCameraCharacteristicsঅনুসারে ফিল্টার করুন।
 নিম্নলিখিত কোড নমুনাটি ডিভাইস নির্বাচনকে প্রভাবিত করার জন্য একটি CameraSelector তৈরি করার পদ্ধতি ব্যাখ্যা করে: 
কোটলিন
fun selectExternalOrBestCamera(provider: ProcessCameraProvider):CameraSelector? { val cam2Infos = provider.availableCameraInfos.map { Camera2CameraInfo.from(it) }.sortedByDescending { // HARDWARE_LEVEL is Int type, with the order of: // LEGACY < LIMITED < FULL < LEVEL_3 < EXTERNAL it.getCameraCharacteristic(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) } return when { cam2Infos.isNotEmpty() -> { CameraSelector.Builder() .addCameraFilter { it.filter { camInfo -> // cam2Infos[0] is either EXTERNAL or best built-in camera val thisCamId = Camera2CameraInfo.from(camInfo).cameraId thisCamId == cam2Infos[0].cameraId } }.build() } else -> null } } // create a CameraSelector for the USB camera (or highest level internal camera) val selector = selectExternalOrBestCamera(processCameraProvider) processCameraProvider.bindToLifecycle(this, selector, preview, analysis)
একসাথে একাধিক ক্যামেরা নির্বাচন করুন
CameraX 1.3 দিয়ে শুরু করে, আপনি একই সাথে একাধিক ক্যামেরা নির্বাচন করতে পারেন। উদাহরণস্বরূপ, আপনি একই সাথে উভয় দৃষ্টিকোণ থেকে ছবি তোলা বা ভিডিও রেকর্ড করার জন্য সামনের এবং পিছনের ক্যামেরার সাথে সংযুক্ত করতে পারেন।
 কনকারেন্ট ক্যামেরা বৈশিষ্ট্যটি ব্যবহার করার সময়, ডিভাইসটি একই সময়ে ভিন্ন-মুখী লেন্স সহ দুটি ক্যামেরা পরিচালনা করতে পারে, অথবা একই সময়ে দুটি ব্যাক ক্যামেরা পরিচালনা করতে পারে। নিম্নলিখিত কোড ব্লকটি দেখায় যে bindToLifecycle কল করার সময় দুটি ক্যামেরা কীভাবে সেট করতে হয় এবং ফিরে আসা ConcurrentCamera অবজেক্ট থেকে উভয় ক্যামেরা অবজেক্ট কীভাবে পেতে হয়। 
কোটলিন
// Build ConcurrentCameraConfig val primary = ConcurrentCamera.SingleCameraConfig( primaryCameraSelector, useCaseGroup, lifecycleOwner ) val secondary = ConcurrentCamera.SingleCameraConfig( secondaryCameraSelector, useCaseGroup, lifecycleOwner ) val concurrentCamera = cameraProvider.bindToLifecycle( listOf(primary, secondary) ) val primaryCamera = concurrentCamera.cameras[0] val secondaryCamera = concurrentCamera.cameras[1]
জাভা
// Build ConcurrentCameraConfig SingleCameraConfig primary = new SingleCameraConfig( primaryCameraSelector, useCaseGroup, lifecycleOwner ); SingleCameraConfig secondary = new SingleCameraConfig( primaryCameraSelector, useCaseGroup, lifecycleOwner ); ConcurrentCamera concurrentCamera = mCameraProvider.bindToLifecycle(Arrays.asList(primary, secondary)); Camera primaryCamera = concurrentCamera.getCameras().get(0); Camera secondaryCamera = concurrentCamera.getCameras().get(1);
ক্যামেরার রেজোলিউশন
আপনি ডিভাইসের ক্ষমতা, ডিভাইসের সমর্থিত হার্ডওয়্যার স্তর , ব্যবহারের ধরণ এবং প্রদত্ত আকৃতির অনুপাতের সংমিশ্রণের উপর ভিত্তি করে CameraX-কে ছবির রেজোলিউশন সেট করতে দিতে পারেন। বিকল্পভাবে, আপনি একটি নির্দিষ্ট লক্ষ্য রেজোলিউশন বা সেই কনফিগারেশন সমর্থন করে এমন ব্যবহারের ক্ষেত্রে একটি নির্দিষ্ট আকৃতির অনুপাত সেট করতে পারেন।
স্বয়ংক্রিয় রেজোলিউশন
 CameraX স্বয়ংক্রিয়ভাবে cameraProcessProvider.bindToLifecycle() এ নির্দিষ্ট ব্যবহারের ক্ষেত্রের উপর ভিত্তি করে সর্বোত্তম রেজোলিউশন সেটিংস নির্ধারণ করতে পারে। যখনই সম্ভব, একটি একক bindToLifecycle() কলে একটি একক সেশনে একই সাথে চালানোর জন্য প্রয়োজনীয় সমস্ত ব্যবহারের ক্ষেত্রে নির্দিষ্ট করুন। CameraX ডিভাইসের সমর্থিত হার্ডওয়্যার স্তর বিবেচনা করে এবং ডিভাইস-নির্দিষ্ট ভ্যারিয়েন্স (যেখানে একটি ডিভাইস উপলব্ধ স্ট্রিম কনফিগারেশন অতিক্রম করে বা পূরণ করে না) বিবেচনা করে আবদ্ধ ব্যবহারের ক্ষেত্রের সেটের উপর ভিত্তি করে রেজোলিউশন নির্ধারণ করে। উদ্দেশ্য হল অ্যাপ্লিকেশনটিকে ডিভাইস-নির্দিষ্ট কোড পাথগুলিকে কমিয়ে বিভিন্ন ধরণের ডিভাইসে চলতে দেওয়া।
ছবি তোলা এবং ছবি বিশ্লেষণ ব্যবহারের ক্ষেত্রে ডিফল্ট আকৃতির অনুপাত হল 4:3।
ব্যবহারের ক্ষেত্রে একটি কনফিগারযোগ্য আকৃতির অনুপাত থাকে যা অ্যাপ্লিকেশনটিকে UI ডিজাইনের উপর ভিত্তি করে পছন্দসই আকৃতির অনুপাত নির্দিষ্ট করতে দেয়। ডিভাইসটি যতটা সমর্থন করে ততটাই অনুরোধ করা আকৃতির অনুপাতের সাথে মিল রেখে CameraX আউটপুট তৈরি করা হয়। যদি কোনও সঠিক-মিল রেজোলিউশন সমর্থিত না থাকে, তবে যেটি সর্বাধিক শর্ত পূরণ করে তা নির্বাচন করা হয়। সুতরাং, অ্যাপ্লিকেশনটি অ্যাপে ক্যামেরাটি কীভাবে প্রদর্শিত হবে তা নির্দেশ করে এবং CameraX বিভিন্ন ডিভাইসে এটি পূরণ করার জন্য সেরা ক্যামেরা রেজোলিউশন সেটিংস নির্ধারণ করে।
উদাহরণস্বরূপ, একটি অ্যাপ নিম্নলিখিত যেকোনো একটি করতে পারে:
- ব্যবহারের ক্ষেত্রে ৪:৩ অথবা ১৬:৯ এর লক্ষ্য রেজোলিউশন নির্দিষ্ট করুন
- একটি কাস্টম রেজোলিউশন নির্দিষ্ট করুন, যার সাথে CameraX সবচেয়ে কাছের মিল খুঁজে বের করার চেষ্টা করে
-  ImageCaptureএর জন্য একটি ক্রপিং আকৃতির অনুপাত নির্দিষ্ট করুন
CameraX স্বয়ংক্রিয়ভাবে অভ্যন্তরীণ Camera2 পৃষ্ঠের রেজোলিউশন নির্বাচন করে। নিম্নলিখিত টেবিলটি রেজোলিউশনগুলি দেখায়:
| ব্যবহারের ধরণ | অভ্যন্তরীণ পৃষ্ঠের রেজোলিউশন | আউটপুট ডেটা রেজোলিউশন | 
|---|---|---|
| প্রিভিউ | আকৃতির অনুপাত: সেই রেজোলিউশন যা লক্ষ্যবস্তুর সাথে সবচেয়ে ভালোভাবে খাপ খায়। | অভ্যন্তরীণ পৃষ্ঠের রেজোলিউশন। লক্ষ্য অনুপাতের জন্য ভিউ ক্রপ, স্কেল এবং ঘোরানোর জন্য মেটাডেটা সরবরাহ করা হয়। | 
| ডিফল্ট রেজোলিউশন: সর্বোচ্চ প্রিভিউ রেজোলিউশন, অথবা সর্বোচ্চ ডিভাইস-পছন্দসই রেজোলিউশন যা প্রিভিউয়ের আকৃতির অনুপাতের সাথে মেলে। | ||
| সর্বোচ্চ রেজোলিউশন: প্রিভিউ সাইজ, যা ডিভাইসের স্ক্রিন রেজোলিউশনের সাথে মিলিত সেরা আকারকে বোঝায়, অথবা 1080p (1920x1080), যেটি ছোট। | ||
| চিত্র বিশ্লেষণ | আকৃতির অনুপাত: সেই রেজোলিউশন যা লক্ষ্যবস্তুর সাথে সবচেয়ে ভালোভাবে খাপ খায়। | অভ্যন্তরীণ পৃষ্ঠের রেজোলিউশন। | 
| ডিফল্ট রেজোলিউশন: ডিফল্ট টার্গেট রেজোলিউশন সেটিং হল 640x480। টার্গেট রেজোলিউশন এবং সংশ্লিষ্ট আকৃতির অনুপাত উভয়ই সামঞ্জস্য করলে একটি সেরা-সমর্থিত রেজোলিউশন পাওয়া যায়। | ||
| সর্বোচ্চ রেজোলিউশন: ক্যামেরা ডিভাইসের সর্বোচ্চ আউটপুট রেজোলিউশন YUV_420_888 ফর্ম্যাট যা StreamConfigurationMap.getOutputSizes()থেকে পুনরুদ্ধার করা হয়েছে। ডিফল্টরূপে লক্ষ্য রেজোলিউশন 640x480 হিসাবে সেট করা হয়, তাই আপনি যদি 640x480 এর চেয়ে বড় রেজোলিউশন চান, তাহলে সমর্থিত রেজোলিউশন থেকে নিকটতমটি পেতে আপনাকেsetTargetResolution()এবংsetTargetAspectRatio()ব্যবহার করতে হবে। | ||
| ছবি তোলা | আকৃতির অনুপাত: আকৃতির অনুপাত যা সেটিংয়ের সাথে সবচেয়ে ভালোভাবে মানানসই। | অভ্যন্তরীণ পৃষ্ঠের রেজোলিউশন। | 
| ডিফল্ট রেজোলিউশন: সর্বোচ্চ উপলব্ধ রেজোলিউশন, অথবা সর্বোচ্চ ডিভাইস-পছন্দসই রেজোলিউশন যা ImageCapture এর আকৃতির অনুপাতের সাথে মেলে। | ||
| সর্বোচ্চ রেজোলিউশন: ক্যামেরা ডিভাইসের সর্বোচ্চ আউটপুট রেজোলিউশন JPEG ফর্ম্যাটে। এটি পুনরুদ্ধার করতে StreamConfigurationMap.getOutputSizes()ব্যবহার করুন। | 
একটি রেজোলিউশন নির্দিষ্ট করুন
 নিম্নলিখিত কোড নমুনায় দেখানো setTargetResolution(Size resolution) পদ্ধতি ব্যবহার করে ব্যবহারের কেস তৈরি করার সময় আপনি নির্দিষ্ট রেজোলিউশন সেট করতে পারেন: 
কোটলিন
val imageAnalysis = ImageAnalysis.Builder() .setTargetResolution(Size(1280, 720)) .build()
জাভা
ImageAnalysis imageAnalysis = new ImageAnalysis.Builder() .setTargetResolution(new Size(1280, 720)) .build();
 একই ব্যবহারের ক্ষেত্রে আপনি লক্ষ্য অনুপাত এবং লক্ষ্য রেজোলিউশন উভয়ই সেট করতে পারবেন না। এটি করলে কনফিগারেশন অবজেক্ট তৈরি করার সময় একটি IllegalArgumentException আসবে।
 লক্ষ্য ঘূর্ণন দ্বারা সমর্থিত আকারগুলি ঘোরানোর পরে স্থানাঙ্ক ফ্রেমে রেজোলিউশন Size প্রকাশ করুন। উদাহরণস্বরূপ, প্রাকৃতিক লক্ষ্য ঘূর্ণনে পোর্ট্রেট প্রাকৃতিক ওরিয়েন্টেশন সহ একটি ডিভাইস যা একটি পোর্ট্রেট চিত্রের অনুরোধ করে 480x640 নির্দিষ্ট করতে পারে, এবং একই ডিভাইস, 90 ডিগ্রি ঘোরানো এবং লক্ষ্যবস্তু ল্যান্ডস্কেপ ওরিয়েন্টেশন 640x480 নির্দিষ্ট করতে পারে।
লক্ষ্য রেজোলিউশনটি ছবির রেজোলিউশনের জন্য একটি ন্যূনতম সীমা নির্ধারণ করার চেষ্টা করে। প্রকৃত চিত্র রেজোলিউশন হল আকারে সবচেয়ে কাছের উপলব্ধ রেজোলিউশন যা ক্যামেরা বাস্তবায়ন দ্বারা নির্ধারিত লক্ষ্য রেজোলিউশনের চেয়ে ছোট নয়।
 তবে, যদি লক্ষ্য রেজোলিউশনের সমান বা তার চেয়ে বড় কোনও রেজোলিউশন না থাকে, তাহলে লক্ষ্য রেজোলিউশনের চেয়ে কম নিকটতম উপলব্ধ রেজোলিউশনটি বেছে নেওয়া হয়। প্রদত্ত Size একই আকৃতির অনুপাতের রেজোলিউশনগুলিকে বিভিন্ন আকৃতির অনুপাতের রেজোলিউশনের চেয়ে বেশি অগ্রাধিকার দেওয়া হয়।
 অনুরোধের উপর ভিত্তি করে CameraX সর্বোত্তম উপযুক্ত রেজোলিউশন প্রয়োগ করে। যদি প্রাথমিক প্রয়োজন আকৃতির অনুপাত পূরণ করা হয়, তাহলে শুধুমাত্র setTargetAspectRatio নির্দিষ্ট করুন, এবং CameraX ডিভাইসের উপর ভিত্তি করে উপযুক্ত একটি নির্দিষ্ট রেজোলিউশন নির্ধারণ করে। যদি অ্যাপের প্রাথমিক প্রয়োজন হয় চিত্র প্রক্রিয়াকরণকে আরও দক্ষ করার জন্য একটি রেজোলিউশন নির্দিষ্ট করা (উদাহরণস্বরূপ, ডিভাইস প্রক্রিয়াকরণ ক্ষমতার উপর ভিত্তি করে একটি ছোট বা মাঝারি আকারের চিত্র), তাহলে setTargetResolution(Size resolution) ব্যবহার করুন।
 যদি আপনার অ্যাপের সঠিক রেজোলিউশনের প্রয়োজন হয়, তাহলে প্রতিটি হার্ডওয়্যার স্তরে সর্বোচ্চ কত রেজোলিউশন সমর্থিত তা নির্ধারণ করতে createCaptureSession() এর মধ্যে টেবিলটি দেখুন। বর্তমান ডিভাইসে সমর্থিত নির্দিষ্ট রেজোলিউশন পরীক্ষা করতে, StreamConfigurationMap.getOutputSizes(int) দেখুন।
 যদি আপনার অ্যাপটি অ্যান্ড্রয়েড ১০ বা তার পরবর্তী ভার্সনে চলে, তাহলে আপনি একটি নির্দিষ্ট SessionConfiguration যাচাই করতে isSessionConfigurationSupported() ব্যবহার করতে পারেন।
ক্যামেরার আউটপুট নিয়ন্ত্রণ করুন
প্রতিটি পৃথক ব্যবহারের ক্ষেত্রে প্রয়োজন অনুসারে ক্যামেরা আউটপুট কনফিগার করার সুবিধা প্রদানের পাশাপাশি, CameraX সমস্ত আবদ্ধ ব্যবহারের ক্ষেত্রে সাধারণ ক্যামেরা অপারেশনগুলিকে সমর্থন করার জন্য নিম্নলিখিত ইন্টারফেসগুলিও প্রয়োগ করে:
-  CameraControlআপনাকে সাধারণ ক্যামেরা বৈশিষ্ট্যগুলি কনফিগার করতে দেয়।
-  CameraInfoআপনাকে সেই সাধারণ ক্যামেরা বৈশিষ্ট্যগুলির অবস্থা জিজ্ঞাসা করতে দেয়।
ক্যামেরাকন্ট্রোলের সাথে সমর্থিত ক্যামেরা বৈশিষ্ট্যগুলি এখানে দেওয়া হল:
- জুম
- টর্চ
- ফোকাস এবং মিটারিং (ট্যাপ-টু-ফোকাস)
- এক্সপোজার ক্ষতিপূরণ
ক্যামেরাকন্ট্রোল এবং ক্যামেরাইনফোর উদাহরণ পান
 ProcessCameraProvider.bindToLifecycle() দ্বারা ফেরত আসা Camera অবজেক্ট ব্যবহার করে CameraControl এবং CameraInfo এর উদাহরণগুলি পুনরুদ্ধার করুন। নিম্নলিখিত কোডটি একটি উদাহরণ দেখায়: 
কোটলিন
val camera = processCameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview) // For performing operations that affect all outputs. val cameraControl = camera.cameraControl // For querying information and states. val cameraInfo = camera.cameraInfo
জাভা
Camera camera = processCameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview) // For performing operations that affect all outputs. CameraControl cameraControl = camera.getCameraControl() // For querying information and states. CameraInfo cameraInfo = camera.getCameraInfo()
 উদাহরণস্বরূপ, আপনি bindToLifecycle() কল করার পরে জুম এবং অন্যান্য CameraControl অপারেশন জমা দিতে পারেন। ক্যামেরা ইনস্ট্যান্স বাঁধতে ব্যবহৃত কার্যকলাপ বন্ধ বা ধ্বংস করার পরে, CameraControl আর অপারেশন চালাতে পারবে না এবং একটি ব্যর্থ ListenableFuture ফেরত পাঠাবে।
জুম
জুম লেভেল পরিবর্তন করার জন্য ক্যামেরাকন্ট্রোল দুটি পদ্ধতি অফার করে:
- setZoomRatio()জুম অনুপাত অনুসারে জুম সেট করে।- অনুপাতটি - CameraInfo.getZoomState().getValue().getMinZoomRatio()এবং- CameraInfo.getZoomState().getValue().getMaxZoomRatio()এর মধ্যে হতে হবে। অন্যথায় ফাংশনটি একটি ব্যর্থ- ListenableFutureপ্রদান করবে।
- setLinearZoom()বর্তমান জুমকে 0 থেকে 1.0 পর্যন্ত একটি রৈখিক জুম মান সহ সেট করে।- লিনিয়ার জুমের সুবিধা হলো এটি জুমের পরিবর্তনের সাথে সাথে ফিল্ড অফ ভিউ (FOV) স্কেল করে। এটি - Sliderভিউয়ের সাথে ব্যবহারের জন্য আদর্শ করে তোলে।
 CameraInfo.getZoomState() বর্তমান জুম অবস্থার একটি LiveData ফেরত দেয়। ক্যামেরাটি শুরু করার সময় অথবা setZoomRatio() অথবা setLinearZoom() ব্যবহার করে জুম লেভেল সেট করা হলে মান পরিবর্তন হয়। যেকোনো পদ্ধতিতে কল করলে ZoomState.getZoomRatio() এবং ZoomState.getLinearZoom() এর সমর্থনকারী মান সেট হয়। আপনি যদি স্লাইডারের পাশাপাশি জুম অনুপাতের টেক্সট প্রদর্শন করতে চান তবে এটি সহায়ক। রূপান্তর না করেই উভয় আপডেট করতে ZoomState LiveData পর্যবেক্ষণ করুন।
 উভয় API দ্বারা প্রদত্ত ListenableFuture অ্যাপ্লিকেশনগুলিকে নির্দিষ্ট জুম মান সহ পুনরাবৃত্তি অনুরোধ সম্পন্ন হলে বিজ্ঞপ্তি দেওয়ার বিকল্প প্রদান করে। এছাড়াও, পূর্ববর্তী ক্রিয়াকলাপটি কার্যকর হওয়ার সময় যদি আপনি একটি নতুন জুম মান সেট করেন, তাহলে পূর্ববর্তী জুম অপারেশনের ListenableFuture তাৎক্ষণিকভাবে ব্যর্থ হয়।
টর্চ
 CameraControl.enableTorch(boolean) টর্চ (যা টর্চলাইট নামেও পরিচিত) সক্রিয় বা নিষ্ক্রিয় করে।
 CameraInfo.getTorchState() ব্যবহার করে বর্তমান টর্চের অবস্থা অনুসন্ধান করা যেতে পারে। আপনি CameraInfo.hasFlashUnit() দ্বারা ফেরত দেওয়া মান পরীক্ষা করে দেখতে পারেন যে টর্চ উপলব্ধ কিনা। যদি না হয়, CameraControl.enableTorch(boolean) কল করলে ফিরে আসা ListenableFuture অবিলম্বে একটি ব্যর্থ ফলাফল সহ সম্পূর্ণ হবে এবং টর্চের অবস্থা TorchState.OFF এ সেট হবে।
 যখন টর্চটি সক্রিয় থাকে, তখন ফ্ল্যাশমোড সেটিং নির্বিশেষে ছবি এবং ভিডিও ক্যাপচারের সময় এটি চালু থাকে। ImageCapture এর flashMode শুধুমাত্র তখনই কাজ করে যখন টর্চটি অক্ষম থাকে।
ফোকাস এবং মিটারিং
 CameraControl.startFocusAndMetering() প্রদত্ত FocusMeteringAction এর উপর ভিত্তি করে AF/AE/AWB মিটারিং অঞ্চল সেট করে অটোফোকাস এবং এক্সপোজার মিটারিং ট্রিগার করে। এটি প্রায়শই অনেক ক্যামেরা অ্যাপ্লিকেশনে "ট্যাপ টু ফোকাস" বৈশিষ্ট্যটি বাস্তবায়নের জন্য ব্যবহৃত হয়।
মিটারিংপয়েন্ট
 শুরু করতে, MeteringPointFactory.createPoint(float x, float y, float size) ব্যবহার করে একটি MeteringPoint তৈরি করুন। একটি MeteringPoint ক্যামেরার Surface এ একটি একক বিন্দুকে প্রতিনিধিত্ব করে। এটি একটি স্বাভাবিক আকারে সংরক্ষণ করা হয় যাতে এটি সহজেই AF/AE/AWB অঞ্চল নির্দিষ্ট করার জন্য সেন্সর স্থানাঙ্কে রূপান্তরিত করা যায়।
 MeteringPoint এর আকার 0 থেকে 1 পর্যন্ত, যার ডিফল্ট আকার 0.15f। MeteringPointFactory.createPoint(float x, float y, float size) কল করার সময়, CameraX প্রদত্ত size জন্য (x, y) কেন্দ্র করে একটি আয়তক্ষেত্র অঞ্চল তৈরি করে।
 নিম্নলিখিত কোডটি দেখায় কিভাবে একটি MeteringPoint তৈরি করতে হয়: 
কোটলিন
// Use PreviewView.getMeteringPointFactory if PreviewView is used for preview. previewView.setOnTouchListener((view, motionEvent) -> { val meteringPoint = previewView.meteringPointFactory .createPoint(motionEvent.x, motionEvent.y) … } // Use DisplayOrientedMeteringPointFactory if SurfaceView / TextureView is used for // preview. Please note that if the preview is scaled or cropped in the View, // it’s the application's responsibility to transform the coordinates properly // so that the width and height of this factory represents the full Preview FOV. // And the (x,y) passed to create MeteringPoint might need to be adjusted with // the offsets. val meteringPointFactory = DisplayOrientedMeteringPointFactory( surfaceView.display, camera.cameraInfo, surfaceView.width, surfaceView.height ) // Use SurfaceOrientedMeteringPointFactory if the point is specified in // ImageAnalysis ImageProxy. val meteringPointFactory = SurfaceOrientedMeteringPointFactory( imageWidth, imageHeight, imageAnalysis)
startFocusAndMetering এবং FocusMeteringAction
 startFocusAndMetering() ব্যবহার করার জন্য, অ্যাপ্লিকেশনগুলিকে একটি FocusMeteringAction তৈরি করতে হবে, যার মধ্যে FLAG_AF , FLAG_AE , FLAG_AWB থেকে ঐচ্ছিক মিটারিং মোড সংমিশ্রণ সহ এক বা একাধিক MeteringPoints থাকবে। নিম্নলিখিত কোডটি এই ব্যবহারটি প্রদর্শন করে: 
কোটলিন
val meteringPoint1 = meteringPointFactory.createPoint(x1, x1) val meteringPoint2 = meteringPointFactory.createPoint(x2, y2) val action = FocusMeteringAction.Builder(meteringPoint1) // default AF|AE|AWB // Optionally add meteringPoint2 for AF/AE. .addPoint(meteringPoint2, FLAG_AF | FLAG_AE) // The action is canceled in 3 seconds (if not set, default is 5s). .setAutoCancelDuration(3, TimeUnit.SECONDS) .build() val result = cameraControl.startFocusAndMetering(action) // Adds listener to the ListenableFuture if you need to know the focusMetering result. result.addListener({ // result.get().isFocusSuccessful returns if the auto focus is successful or not. }, ContextCompat.getMainExecutor(this)
 পূর্ববর্তী কোডে দেখানো হয়েছে, startFocusAndMetering() একটি FocusMeteringAction নেয় যার মধ্যে AF/AE/AWB মিটারিং অঞ্চলের জন্য একটি MeteringPoint এবং শুধুমাত্র AF এবং AE এর জন্য আরেকটি মিটারিংপয়েন্ট থাকে।
 অভ্যন্তরীণভাবে, CameraX এটিকে Camera2 MeteringRectangles এ রূপান্তর করে এবং ক্যাপচার অনুরোধে সংশ্লিষ্ট CONTROL_AF_REGIONS / CONTROL_AE_REGIONS / CONTROL_AWB_REGIONS প্যারামিটার সেট করে।
 যেহেতু প্রতিটি ডিভাইস AF/AE/AWB এবং একাধিক অঞ্চল সমর্থন করে না, তাই CameraX সর্বোচ্চ প্রচেষ্টার সাথে FocusMeteringAction কার্যকর করে। CameraX সর্বোচ্চ সংখ্যক MeteringPoints সমর্থিত ব্যবহার করে, যে ক্রমে পয়েন্ট যোগ করা হয়েছিল। সর্বাধিক গণনার পরে যোগ করা সমস্ত MeteringPoints উপেক্ষা করা হয়। উদাহরণস্বরূপ, যদি একটি FocusMeteringAction একটি প্ল্যাটফর্মে 3টি MeteringPoints সরবরাহ করে যা মাত্র 2টি সমর্থন করে, তবে শুধুমাত্র প্রথম 2টি MeteringPoints ব্যবহার করা হয়। CameraX দ্বারা চূড়ান্ত MeteringPoint উপেক্ষা করা হয়।
এক্সপোজার ক্ষতিপূরণ
যখন অ্যাপ্লিকেশনগুলিকে অটো এক্সপোজার (AE) আউটপুট ফলাফলের বাইরে এক্সপোজার মান (EV) সূক্ষ্ম-টিউন করার প্রয়োজন হয় তখন এক্সপোজার ক্ষতিপূরণ কার্যকর। বর্তমান চিত্রের অবস্থার জন্য প্রয়োজনীয় এক্সপোজার নির্ধারণের জন্য এক্সপোজার ক্ষতিপূরণ মানগুলি নিম্নলিখিত উপায়ে একত্রিত করা হয়:
 Exposure = ExposureCompensationIndex * ExposureCompensationStep
 CameraX এক্সপোজার ক্ষতিপূরণকে সূচক মান হিসেবে সেট করার জন্য Camera.CameraControl.setExposureCompensationIndex() ফাংশন প্রদান করে।
 ইতিবাচক সূচক মান চিত্রকে উজ্জ্বল করে, অন্যদিকে নেতিবাচক মান চিত্রকে ম্লান করে। অ্যাপ্লিকেশনগুলি পরবর্তী বিভাগে বর্ণিত CameraInfo.ExposureState.exposureCompensationRange() দ্বারা সমর্থিত পরিসরটি অনুসন্ধান করতে পারে। যদি মানটি সমর্থিত হয়, তাহলে ক্যাপচার অনুরোধে মানটি সফলভাবে সক্ষম হলে ফেরত ListenableFuture সম্পূর্ণ হয়; যদি নির্দিষ্ট সূচকটি সমর্থিত পরিসরের বাইরে থাকে, তাহলে setExposureCompensationIndex() ব্যর্থ ফলাফল সহ ফেরত ListenableFuture অবিলম্বে সম্পূর্ণ করে।
 CameraX শুধুমাত্র সর্বশেষ বকেয়া setExposureCompensationIndex() অনুরোধটি সংরক্ষণ করে এবং পূর্ববর্তী অনুরোধটি কার্যকর হওয়ার আগে ফাংশনটিকে একাধিকবার কল করার ফলে এটি বাতিল হয়ে যায়।
নিম্নলিখিত স্নিপেটটি একটি এক্সপোজার ক্ষতিপূরণ সূচক সেট করে এবং এক্সপোজার পরিবর্তনের অনুরোধ কার্যকর হওয়ার সময় একটি কলব্যাক নিবন্ধন করে:
কোটলিন
camera.cameraControl.setExposureCompensationIndex(exposureCompensationIndex) .addListener({ // Get the current exposure compensation index, it might be // different from the asked value in case this request was // canceled by a newer setting request. val currentExposureIndex = camera.cameraInfo.exposureState.exposureCompensationIndex … }, mainExecutor)
- Camera.CameraInfo.getExposureState()বর্তমান- ExposureStateপুনরুদ্ধার করে যার মধ্যে রয়েছে:- এক্সপোজার ক্ষতিপূরণ নিয়ন্ত্রণের সমর্থনযোগ্যতা।
- বর্তমান এক্সপোজার ক্ষতিপূরণ সূচক।
- এক্সপোজার ক্ষতিপূরণ সূচক পরিসর।
- এক্সপোজার ক্ষতিপূরণ মূল্য গণনায় ব্যবহৃত এক্সপোজার ক্ষতিপূরণ ধাপ।
 
 উদাহরণস্বরূপ, নিম্নলিখিত কোডটি বর্তমান ExposureState মান সহ একটি Exposure SeekBar এর সেটিংস শুরু করে: 
কোটলিন
val exposureState = camera.cameraInfo.exposureState binding.seekBar.apply { isEnabled = exposureState.isExposureCompensationSupported max = exposureState.exposureCompensationRange.upper min = exposureState.exposureCompensationRange.lower progress = exposureState.exposureCompensationIndex }
অতিরিক্ত সম্পদ
CameraX সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত সংস্থানগুলি দেখুন।
কোডল্যাব
কোড নমুনা
ডেভেলপার সম্প্রদায়
অ্যান্ড্রয়েড ক্যামেরাএক্স আলোচনা গোষ্ঠী
