ক্যামেরা API

অ্যান্ড্রয়েড ফ্রেমওয়ার্কে বিভিন্ন ক্যামেরা এবং ডিভাইসে উপলব্ধ ক্যামেরা বৈশিষ্ট্যগুলির জন্য সমর্থন রয়েছে, যা আপনাকে আপনার অ্যাপ্লিকেশনগুলিতে ছবি এবং ভিডিও ক্যাপচার করার অনুমতি দেয়। এই নথিতে ছবি এবং ভিডিও ক্যাপচারের একটি দ্রুত, সহজ পদ্ধতি নিয়ে আলোচনা করা হয়েছে এবং আপনার ব্যবহারকারীদের জন্য কাস্টম ক্যামেরা অভিজ্ঞতা তৈরি করার জন্য একটি উন্নত পদ্ধতির রূপরেখা দেওয়া হয়েছে।

দ্রষ্টব্য: এই পৃষ্ঠাটি Camera ক্লাসের বর্ণনা দেয়, যা বন্ধ করে দেওয়া হয়েছে। আমরা CameraX Jetpack লাইব্রেরি অথবা নির্দিষ্ট ব্যবহারের ক্ষেত্রে, camera2 , ক্লাস ব্যবহার করার পরামর্শ দিই। CameraX এবং Camera2 উভয়ই Android 5.0 (API লেভেল 21) এবং উচ্চতর সংস্করণে কাজ করে।

নিম্নলিখিত সম্পর্কিত সম্পদগুলি দেখুন:

বিবেচনা

আপনার অ্যাপ্লিকেশনটিকে অ্যান্ড্রয়েড ডিভাইসে ক্যামেরা ব্যবহার করার জন্য সক্ষম করার আগে, আপনার অ্যাপটি কীভাবে এই হার্ডওয়্যার বৈশিষ্ট্যটি ব্যবহার করতে চায় সে সম্পর্কে কয়েকটি প্রশ্ন বিবেচনা করা উচিত।

  • ক্যামেরার প্রয়োজনীয়তা - আপনার অ্যাপ্লিকেশনের জন্য ক্যামেরার ব্যবহার কি এতই গুরুত্বপূর্ণ যে আপনি চান না যে আপনার অ্যাপ্লিকেশনটি এমন কোনও ডিভাইসে ইনস্টল করা হোক যেখানে ক্যামেরা নেই? যদি তাই হয়, তাহলে আপনার ম্যানিফেস্টে ক্যামেরার প্রয়োজনীয়তা ঘোষণা করা উচিত।
  • দ্রুত ছবি বা কাস্টমাইজড ক্যামেরা - আপনার অ্যাপ্লিকেশনটি ক্যামেরা কীভাবে ব্যবহার করবে? আপনি কি কেবল একটি দ্রুত ছবি বা ভিডিও ক্লিপ তোলার ব্যাপারে আগ্রহী, নাকি আপনার অ্যাপ্লিকেশনটি ক্যামেরা ব্যবহারের জন্য একটি নতুন উপায় প্রদান করবে? দ্রুত ছবি বা ক্লিপ পেতে, বিদ্যমান ক্যামেরা অ্যাপ ব্যবহার করার কথা বিবেচনা করুন। একটি কাস্টমাইজড ক্যামেরা বৈশিষ্ট্য তৈরি করতে, "একটি ক্যামেরা অ্যাপ তৈরি করা" বিভাগটি দেখুন।
  • ফোরগ্রাউন্ড পরিষেবার প্রয়োজনীয়তা - আপনার অ্যাপ কখন ক্যামেরার সাথে ইন্টারঅ্যাক্ট করে? অ্যান্ড্রয়েড ৯ (এপিআই লেভেল ২৮) এবং তার পরবর্তী সংস্করণে, ব্যাকগ্রাউন্ডে চলমান অ্যাপগুলি ক্যামেরা অ্যাক্সেস করতে পারে না। অতএব, আপনার অ্যাপটি ফোরগ্রাউন্ডে থাকা অবস্থায় অথবা ফোরগ্রাউন্ড পরিষেবার অংশ হিসাবে ক্যামেরা ব্যবহার করা উচিত।
  • স্টোরেজ - আপনার অ্যাপ্লিকেশন যে ছবি বা ভিডিও তৈরি করে তা কি শুধুমাত্র আপনার অ্যাপ্লিকেশনের জন্য দৃশ্যমান হওয়ার জন্য তৈরি করা হয়েছে, নাকি এমনভাবে শেয়ার করা হয়েছে যাতে গ্যালারি বা অন্যান্য মিডিয়া এবং সোশ্যাল অ্যাপের মতো অন্যান্য অ্যাপ্লিকেশনগুলি সেগুলি ব্যবহার করতে পারে? আপনি কি চান যে আপনার অ্যাপ্লিকেশনটি আনইনস্টল করা থাকলেও ছবি এবং ভিডিওগুলি উপলব্ধ থাকুক? এই বিকল্পগুলি কীভাবে বাস্তবায়ন করবেন তা দেখতে "মিডিয়া ফাইল সংরক্ষণ" বিভাগটি দেখুন।

মূল বিষয়গুলি

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক android.hardware.camera2 API অথবা camera Intent মাধ্যমে ছবি এবং ভিডিও ক্যাপচার সমর্থন করে। এখানে প্রাসঙ্গিক ক্লাসগুলি দেওয়া হল:

android.hardware.camera2
এই প্যাকেজটি ডিভাইস ক্যামেরা নিয়ন্ত্রণের জন্য প্রাথমিক API। ক্যামেরা অ্যাপ্লিকেশন তৈরি করার সময় এটি ছবি বা ভিডিও তোলার জন্য ব্যবহার করা যেতে পারে।
Camera
এই ক্লাসটি ডিভাইস ক্যামেরা নিয়ন্ত্রণের জন্য পুরানো অবচিত API।
SurfaceView
এই ক্লাসটি ব্যবহারকারীর কাছে একটি লাইভ ক্যামেরা প্রিভিউ উপস্থাপন করতে ব্যবহৃত হয়।
MediaRecorder
এই ক্লাসটি ক্যামেরা থেকে ভিডিও রেকর্ড করার জন্য ব্যবহৃত হয়।
Intent
Camera অবজেক্ট সরাসরি ব্যবহার না করেই ছবি বা ভিডিও ক্যাপচার করার জন্য MediaStore.ACTION_IMAGE_CAPTURE অথবা MediaStore.ACTION_VIDEO_CAPTURE এর একটি ইন্টেন্ট অ্যাকশন টাইপ ব্যবহার করা যেতে পারে।

ম্যানিফেস্ট ঘোষণা

ক্যামেরা এপিআই দিয়ে আপনার অ্যাপ্লিকেশনের ডেভেলপমেন্ট শুরু করার আগে, আপনার ম্যানিফেস্টে ক্যামেরা হার্ডওয়্যার এবং অন্যান্য সম্পর্কিত বৈশিষ্ট্য ব্যবহারের জন্য উপযুক্ত ঘোষণা আছে কিনা তা নিশ্চিত করা উচিত।

  • ক্যামেরার অনুমতি - আপনার অ্যাপ্লিকেশনটিকে অবশ্যই একটি ডিভাইস ক্যামেরা ব্যবহারের অনুমতি চাইতে হবে।
    <uses-permission android:name="android.permission.CAMERA" />

    দ্রষ্টব্য: যদি আপনি কোনও বিদ্যমান ক্যামেরা অ্যাপ ব্যবহার করে ক্যামেরা ব্যবহার করেন, তাহলে আপনার অ্যাপ্লিকেশনটিকে এই অনুমতির অনুরোধ করার প্রয়োজন নেই।

  • ক্যামেরা বৈশিষ্ট্য - আপনার অ্যাপ্লিকেশনটিতে ক্যামেরা বৈশিষ্ট্যগুলির ব্যবহারও ঘোষণা করতে হবে, উদাহরণস্বরূপ:
    <uses-feature android:name="android.hardware.camera" />

    ক্যামেরা বৈশিষ্ট্যের তালিকার জন্য, ম্যানিফেস্ট বৈশিষ্ট্য রেফারেন্স দেখুন।

    আপনার ম্যানিফেস্টে ক্যামেরা বৈশিষ্ট্য যোগ করার ফলে Google Play আপনার অ্যাপ্লিকেশনটি এমন ডিভাইসে ইনস্টল করা থেকে বিরত রাখে যেখানে ক্যামেরা অন্তর্ভুক্ত নেই বা আপনার নির্দিষ্ট ক্যামেরা বৈশিষ্ট্যগুলি সমর্থন করে না। Google Play এর সাথে বৈশিষ্ট্য-ভিত্তিক ফিল্টারিং ব্যবহার সম্পর্কে আরও তথ্যের জন্য, Google Play এবং বৈশিষ্ট্য-ভিত্তিক ফিল্টারিং দেখুন।

    যদি আপনার অ্যাপ্লিকেশনটি সঠিক অপারেশনের জন্য ক্যামেরা বা ক্যামেরা বৈশিষ্ট্য ব্যবহার করতে পারে , কিন্তু এটির প্রয়োজন না হয়, তাহলে আপনার ম্যানিফেস্টে android:required বৈশিষ্ট্যটি অন্তর্ভুক্ত করে এবং এটিকে false এ সেট করে এটি নির্দিষ্ট করা উচিত:

    <uses-feature android:name="android.hardware.camera" android:required="false" />
  • স্টোরেজ অনুমতি - আপনার অ্যাপ্লিকেশনটি যদি অ্যান্ড্রয়েড ১০ (এপিআই লেভেল ২৯) বা তার নিচের ভার্সনকে লক্ষ্য করে এবং ম্যানিফেস্টে নিম্নলিখিত বিষয়গুলি নির্দিষ্ট করে, তাহলে ডিভাইসের এক্সটার্নাল স্টোরেজে (এসডি কার্ড) ছবি বা ভিডিও সংরক্ষণ করতে পারে।
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • অডিও রেকর্ডিং অনুমতি - ভিডিও ক্যাপচার সহ অডিও রেকর্ডিংয়ের জন্য, আপনার আবেদনপত্রে অডিও ক্যাপচার অনুমতির জন্য অনুরোধ করতে হবে।
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
  • অবস্থানের অনুমতি - যদি আপনার অ্যাপ্লিকেশনটি GPS অবস্থানের তথ্য সহ ছবি ট্যাগ করে, তাহলে আপনাকে ACCESS_FINE_LOCATION অনুমতির জন্য অনুরোধ করতে হবে। মনে রাখবেন, যদি আপনার অ্যাপ্লিকেশনটি Android 5.0 (API স্তর 21) বা তার উচ্চতর সংস্করণকে লক্ষ্য করে, তাহলে আপনাকে ঘোষণা করতে হবে যে আপনার অ্যাপ্লিকেশনটি ডিভাইসের GPS ব্যবহার করে:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
    <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
    <uses-feature android:name="android.hardware.location.gps" />

    ব্যবহারকারীর অবস্থান সম্পর্কে আরও তথ্যের জন্য, অবস্থান কৌশল দেখুন।

বিদ্যমান ক্যামেরা অ্যাপ ব্যবহার করা

অতিরিক্ত কোড ব্যবহার না করেই আপনার অ্যাপ্লিকেশনে ছবি বা ভিডিও তোলার সুবিধা চালু করার একটি দ্রুত উপায় হল একটি বিদ্যমান অ্যান্ড্রয়েড ক্যামেরা অ্যাপ্লিকেশন ব্যবহার করে Intent ব্যবহার করা। বিস্তারিত তথ্য "ছবি তোলা সহজভাবে" এবং "ভিডিও রেকর্ডিং সিম্পলি" প্রশিক্ষণ পাঠে বর্ণনা করা হয়েছে।

একটি ক্যামেরা অ্যাপ তৈরি করা

কিছু ডেভেলপারদের এমন একটি ক্যামেরা ইউজার ইন্টারফেসের প্রয়োজন হতে পারে যা তাদের অ্যাপ্লিকেশনের চেহারা অনুসারে কাস্টমাইজ করা হয় বা বিশেষ বৈশিষ্ট্য প্রদান করে। আপনার নিজস্ব ছবি তোলার কোড লেখা আপনার ব্যবহারকারীদের জন্য আরও আকর্ষণীয় অভিজ্ঞতা প্রদান করতে পারে।

দ্রষ্টব্য: নিম্নলিখিত নির্দেশিকাটি পুরানো, অপ্রচলিত Camera API-এর জন্য। নতুন বা উন্নত ক্যামেরা অ্যাপ্লিকেশনের জন্য, নতুন android.hardware.camera2 API সুপারিশ করা হয়।

আপনার অ্যাপ্লিকেশনের জন্য একটি কাস্টম ক্যামেরা ইন্টারফেস তৈরির সাধারণ পদক্ষেপগুলি নিম্নরূপ:

  • ক্যামেরা সনাক্ত করুন এবং অ্যাক্সেস করুন - ক্যামেরার অস্তিত্ব পরীক্ষা করার জন্য কোড তৈরি করুন এবং অ্যাক্সেসের অনুরোধ করুন।
  • একটি প্রিভিউ ক্লাস তৈরি করুন - একটি ক্যামেরা প্রিভিউ ক্লাস তৈরি করুন যা SurfaceView প্রসারিত করে এবং SurfaceHolder ইন্টারফেস প্রয়োগ করে। এই ক্লাসটি ক্যামেরা থেকে লাইভ চিত্রগুলির প্রিভিউ দেখায়।
  • একটি প্রিভিউ লেআউট তৈরি করুন - ক্যামেরা প্রিভিউ ক্লাস হয়ে গেলে, এমন একটি ভিউ লেআউট তৈরি করুন যাতে আপনার পছন্দসই প্রিভিউ এবং ইউজার ইন্টারফেস নিয়ন্ত্রণ অন্তর্ভুক্ত থাকে।
  • ক্যাপচারের জন্য শ্রোতাদের সেটআপ করুন - ব্যবহারকারীর ক্রিয়াকলাপের প্রতিক্রিয়ায় ছবি বা ভিডিও ক্যাপচার শুরু করতে আপনার ইন্টারফেস নিয়ন্ত্রণের জন্য শ্রোতাদের সংযুক্ত করুন, যেমন একটি বোতাম টিপুন।
  • ফাইল ক্যাপচার এবং সেভ করুন - ছবি বা ভিডিও ক্যাপচার এবং আউটপুট সংরক্ষণের জন্য কোড সেটআপ করুন।
  • ক্যামেরাটি ছেড়ে দিন - ক্যামেরাটি ব্যবহার করার পরে, আপনার অ্যাপ্লিকেশনটিকে অবশ্যই অন্যান্য অ্যাপ্লিকেশনগুলির ব্যবহারের জন্য এটি সঠিকভাবে ছেড়ে দিতে হবে।

ক্যামেরা হার্ডওয়্যার একটি ভাগ করা রিসোর্স যা সাবধানতার সাথে পরিচালনা করতে হবে যাতে আপনার অ্যাপ্লিকেশনটি অন্যান্য অ্যাপ্লিকেশনের সাথে সংঘর্ষ না করে যারা এটি ব্যবহার করতে চাইতে পারে। নিম্নলিখিত বিভাগগুলিতে আলোচনা করা হয়েছে কিভাবে ক্যামেরা হার্ডওয়্যার সনাক্ত করতে হয়, কিভাবে ক্যামেরা অ্যাক্সেসের অনুরোধ করতে হয়, কিভাবে ছবি বা ভিডিও ক্যাপচার করতে হয় এবং আপনার অ্যাপ্লিকেশনটি ব্যবহার করা শেষ হলে কীভাবে ক্যামেরাটি ছেড়ে দিতে হয়।

সাবধানতা: আপনার অ্যাপ্লিকেশনটি ব্যবহার করা শেষ হলে Camera.release() কল করে Camera অবজেক্টটি ছেড়ে দিতে ভুলবেন না! যদি আপনার অ্যাপ্লিকেশনটি সঠিকভাবে ক্যামেরাটি ছেড়ে না দেয়, তাহলে ক্যামেরা অ্যাক্সেস করার পরবর্তী সমস্ত প্রচেষ্টা, আপনার নিজস্ব অ্যাপ্লিকেশন সহ, ব্যর্থ হবে এবং আপনার বা অন্যান্য অ্যাপ্লিকেশনগুলি বন্ধ করে দিতে পারে।

ক্যামেরা হার্ডওয়্যার সনাক্ত করা হচ্ছে

যদি আপনার অ্যাপ্লিকেশনের জন্য ম্যানিফেস্ট ডিক্লেয়ারেশন ব্যবহার করে বিশেষভাবে ক্যামেরার প্রয়োজন না হয়, তাহলে রানটাইমে ক্যামেরা উপলব্ধ কিনা তা পরীক্ষা করে দেখা উচিত। এই পরীক্ষাটি সম্পাদন করতে, নীচের উদাহরণ কোডে দেখানো PackageManager.hasSystemFeature() পদ্ধতিটি ব্যবহার করুন:

কোটলিন

/** Check if this device has a camera */
private fun checkCameraHardware(context: Context): Boolean {
    if (context.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        // this device has a camera
        return true
    } else {
        // no camera on this device
        return false
    }
}

জাভা

/** Check if this device has a camera */
private boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}

অ্যান্ড্রয়েড ডিভাইসে একাধিক ক্যামেরা থাকতে পারে, উদাহরণস্বরূপ ফটোগ্রাফির জন্য একটি পিছনের ক্যামেরা এবং ভিডিও কলের জন্য একটি সামনের ক্যামেরা। অ্যান্ড্রয়েড 2.3 (API লেভেল 9) এবং পরবর্তী সংস্করণগুলি আপনাকে Camera.getNumberOfCameras() পদ্ধতি ব্যবহার করে একটি ডিভাইসে উপলব্ধ ক্যামেরার সংখ্যা পরীক্ষা করার অনুমতি দেয়।

ক্যামেরা অ্যাক্সেস করা

যদি আপনি নির্ধারণ করে থাকেন যে আপনার অ্যাপ্লিকেশনটি যে ডিভাইসে চলছে সেটির একটি ক্যামেরা আছে, তাহলে আপনাকে Camera একটি উদাহরণ পেয়ে এটি অ্যাক্সেস করার জন্য অনুরোধ করতে হবে (যদি না আপনি ক্যামেরা অ্যাক্সেস করার উদ্দেশ্যে ব্যবহার করছেন)।

প্রাথমিক ক্যামেরা অ্যাক্সেস করতে, Camera.open() পদ্ধতিটি ব্যবহার করুন এবং নীচের কোডে দেখানো যেকোনো ব্যতিক্রম ধরতে ভুলবেন না:

কোটলিন

/** A safe way to get an instance of the Camera object. */
fun getCameraInstance(): Camera? {
    return try {
        Camera.open() // attempt to get a Camera instance
    } catch (e: Exception) {
        // Camera is not available (in use or does not exist)
        null // returns null if camera is unavailable
    }
}

জাভা

/** A safe way to get an instance of the Camera object. */
public static Camera getCameraInstance(){
    Camera c = null;
    try {
        c = Camera.open(); // attempt to get a Camera instance
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
    }
    return c; // returns null if camera is unavailable
}

সতর্কতা: Camera.open() ব্যবহার করার সময় সর্বদা ব্যতিক্রমগুলি পরীক্ষা করুন। ক্যামেরাটি ব্যবহৃত হচ্ছে কিনা বা বিদ্যমান নেই কিনা তা পরীক্ষা করতে ব্যর্থ হলে সিস্টেম আপনার অ্যাপ্লিকেশনটি বন্ধ করে দেবে।

অ্যান্ড্রয়েড ২.৩ (এপিআই লেভেল ৯) বা তার বেশি চলমান ডিভাইসগুলিতে, আপনি Camera.open(int) ব্যবহার করে নির্দিষ্ট ক্যামেরা অ্যাক্সেস করতে পারেন। উপরের উদাহরণ কোডটি একাধিক ক্যামেরা সহ ডিভাইসে প্রথম, পিছনের দিকের ক্যামেরা অ্যাক্সেস করবে।

ক্যামেরার বৈশিষ্ট্যগুলি পরীক্ষা করা হচ্ছে

একবার আপনি ক্যামেরা অ্যাক্সেস পেয়ে গেলে, আপনি Camera.getParameters() পদ্ধতি ব্যবহার করে এবং সমর্থিত ক্ষমতার জন্য ফিরে আসা Camera.Parameters অবজেক্টটি পরীক্ষা করে এর ক্ষমতা সম্পর্কে আরও তথ্য পেতে পারেন। API লেভেল 9 বা তার বেশি ব্যবহার করার সময়, ক্যামেরাটি ডিভাইসের সামনের দিকে না পিছনে আছে কিনা এবং চিত্রটির ওরিয়েন্টেশন নির্ধারণ করতে Camera.getCameraInfo() ব্যবহার করুন।

একটি প্রিভিউ ক্লাস তৈরি করা হচ্ছে

ব্যবহারকারীদের কার্যকরভাবে ছবি বা ভিডিও তোলার জন্য, তাদের অবশ্যই ডিভাইসের ক্যামেরা কী দেখছে তা দেখতে সক্ষম হতে হবে। একটি ক্যামেরা প্রিভিউ ক্লাস হল একটি SurfaceView যা ক্যামেরা থেকে আসা লাইভ ইমেজ ডেটা প্রদর্শন করতে পারে, যাতে ব্যবহারকারীরা একটি ছবি বা ভিডিও ফ্রেম এবং ক্যাপচার করতে পারে।

নিচের উদাহরণ কোডটি দেখায় কিভাবে একটি বেসিক ক্যামেরা প্রিভিউ ক্লাস তৈরি করতে হয় যা View লেআউটে অন্তর্ভুক্ত করা যেতে পারে। এই ক্লাসটি SurfaceHolder.Callback প্রয়োগ করে যাতে ভিউ তৈরি এবং ধ্বংস করার জন্য কলব্যাক ইভেন্টগুলি ক্যাপচার করা যায়, যা ক্যামেরা প্রিভিউ ইনপুট বরাদ্দ করার জন্য প্রয়োজনীয়।

কোটলিন

/** A basic Camera preview class */
class CameraPreview(
        context: Context,
        private val mCamera: Camera
) : SurfaceView(context), SurfaceHolder.Callback {

    private val mHolder: SurfaceHolder = holder.apply {
        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        addCallback(this@CameraPreview)
        // deprecated setting, but required on Android versions prior to 3.0
        setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)
    }

    override fun surfaceCreated(holder: SurfaceHolder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        mCamera.apply {
            try {
                setPreviewDisplay(holder)
                startPreview()
            } catch (e: IOException) {
                Log.d(TAG, "Error setting camera preview: ${e.message}")
            }
        }
    }

    override fun surfaceDestroyed(holder: SurfaceHolder) {
        // empty. Take care of releasing the Camera preview in your activity.
    }

    override fun surfaceChanged(holder: SurfaceHolder, format: Int, w: Int, h: Int) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.
        if (mHolder.surface == null) {
            // preview surface does not exist
            return
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview()
        } catch (e: Exception) {
            // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        mCamera.apply {
            try {
                setPreviewDisplay(mHolder)
                startPreview()
            } catch (e: Exception) {
                Log.d(TAG, "Error starting camera preview: ${e.message}")
            }
        }
    }
}

জাভা

/** A basic Camera preview class */
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraPreview(Context context, Camera camera) {
        super(context);
        mCamera = camera;

        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // The Surface has been created, now tell the camera where to draw the preview.
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d(TAG, "Error setting camera preview: " + e.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // empty. Take care of releasing the Camera preview in your activity.
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.

        if (mHolder.getSurface() == null){
          // preview surface does not exist
          return;
        }

        // stop preview before making changes
        try {
            mCamera.stopPreview();
        } catch (Exception e){
          // ignore: tried to stop a non-existent preview
        }

        // set preview size and make any resize, rotate or
        // reformatting changes here

        // start preview with new settings
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception e){
            Log.d(TAG, "Error starting camera preview: " + e.getMessage());
        }
    }
}

If you want to set a specific size for your camera preview, set this in the surfaceChanged() method as noted in the comments above. When setting preview size, you must use values from getSupportedPreviewSizes() . Do not set arbitrary values in the setPreviewSize() method.

দ্রষ্টব্য: অ্যান্ড্রয়েড ৭.০ (এপিআই লেভেল ২৪) এবং তার পরবর্তী সংস্করণে মাল্টি-উইন্ডো বৈশিষ্ট্যটি চালু হওয়ার সাথে সাথে, আপনি আর ধরে নিতে পারবেন না যে setDisplayOrientation() কল করার পরেও প্রিভিউয়ের আকৃতির অনুপাত আপনার কার্যকলাপের মতোই থাকবে। উইন্ডোর আকার এবং আকৃতির অনুপাতের উপর নির্ভর করে, আপনাকে একটি প্রশস্ত ক্যামেরা প্রিভিউ একটি পোর্ট্রেট-ওরিয়েন্টেড লেআউটে ফিট করতে হতে পারে, অথবা এর বিপরীতে, একটি লেটারবক্স লেআউট ব্যবহার করতে হতে পারে।

একটি লেআউটে প্রিভিউ স্থাপন করা

একটি ক্যামেরা প্রিভিউ ক্লাস, যেমন পূর্ববর্তী বিভাগে দেখানো উদাহরণ, একটি ছবি বা ভিডিও তোলার জন্য অন্যান্য ইউজার ইন্টারফেস নিয়ন্ত্রণের সাথে একটি কার্যকলাপের লেআউটে স্থাপন করা আবশ্যক। এই বিভাগটি আপনাকে প্রিভিউয়ের জন্য একটি মৌলিক লেআউট এবং কার্যকলাপ কীভাবে তৈরি করতে হয় তা দেখায়।

নিম্নলিখিত লেআউট কোডটি একটি খুব মৌলিক ভিউ প্রদান করে যা ক্যামেরা প্রিভিউ প্রদর্শনের জন্য ব্যবহার করা যেতে পারে। এই উদাহরণে, FrameLayout উপাদানটি ক্যামেরা প্রিভিউ ক্লাসের জন্য ধারক হিসেবে ব্যবহৃত হয়েছে। এই লেআউট প্রকারটি ব্যবহার করা হয় যাতে অতিরিক্ত ছবির তথ্য বা নিয়ন্ত্রণগুলি লাইভ ক্যামেরা প্রিভিউ ছবিতে ওভারলে করা যায়।

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
  <FrameLayout
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    />

  <Button
    android:id="@+id/button_capture"
    android:text="Capture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    />
</LinearLayout>

বেশিরভাগ ডিভাইসে, ক্যামেরা প্রিভিউয়ের ডিফল্ট ওরিয়েন্টেশন হল ল্যান্ডস্কেপ। এই উদাহরণ লেআউটটি একটি অনুভূমিক (ল্যান্ডস্কেপ) লেআউট নির্দিষ্ট করে এবং নীচের কোডটি অ্যাপ্লিকেশনটির ওরিয়েন্টেশনকে ল্যান্ডস্কেপে ঠিক করে। ক্যামেরা প্রিভিউ রেন্ডার করার সহজতার জন্য, আপনার ম্যানিফেস্টে নিম্নলিখিতটি যোগ করে আপনার অ্যাপ্লিকেশনের প্রিভিউ অ্যাক্টিভিটি ওরিয়েন্টেশনকে ল্যান্ডস্কেপে পরিবর্তন করা উচিত।

<activity android:name=".CameraActivity"
          android:label="@string/app_name"

          android:screenOrientation="landscape">
          <!-- configure this activity to use landscape orientation -->

          <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

দ্রষ্টব্য: ক্যামেরা প্রিভিউ ল্যান্ডস্কেপ মোডে থাকা আবশ্যক নয়। অ্যান্ড্রয়েড ২.২ (এপিআই লেভেল ৮) থেকে শুরু করে, আপনি প্রিভিউ ছবির ঘূর্ণন সেট করতে setDisplayOrientation() পদ্ধতি ব্যবহার করতে পারেন। ব্যবহারকারী ফোনটি পুনরায় ওরিয়েন্ট করার সময় প্রিভিউ ওরিয়েন্টেশন পরিবর্তন করতে, আপনার প্রিভিউ ক্লাসের surfaceChanged() পদ্ধতিতে, প্রথমে Camera.stopPreview() দিয়ে প্রিভিউ বন্ধ করুন, ওরিয়েন্টেশন পরিবর্তন করুন এবং তারপর Camera.startPreview() দিয়ে আবার প্রিভিউ শুরু করুন।

আপনার ক্যামেরা ভিউয়ের অ্যাক্টিভিটিতে, উপরের উদাহরণে দেখানো FrameLayout এলিমেন্টে আপনার প্রিভিউ ক্লাস যোগ করুন। আপনার ক্যামেরা অ্যাক্টিভিটিকে অবশ্যই নিশ্চিত করতে হবে যে এটি পজ বা বন্ধ করার সময় ক্যামেরাটি রিলিজ করে। নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে একটি ক্যামেরা অ্যাক্টিভিটি পরিবর্তন করে প্রিভিউ ক্লাস সংযুক্ত করতে হয় যা Creating a Preview class এ দেখানো হয়েছে।

কোটলিন

class CameraActivity : Activity() {

    private var mCamera: Camera? = null
    private var mPreview: CameraPreview? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Create an instance of Camera
        mCamera = getCameraInstance()

        mPreview = mCamera?.let {
            // Create our Preview view
            CameraPreview(this, it)
        }

        // Set the Preview view as the content of our activity.
        mPreview?.also {
            val preview: FrameLayout = findViewById(R.id.camera_preview)
            preview.addView(it)
        }
    }
}

জাভা

public class CameraActivity extends Activity {

    private Camera mCamera;
    private CameraPreview mPreview;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Create an instance of Camera
        mCamera = getCameraInstance();

        // Create our Preview view and set it as the content of our activity.
        mPreview = new CameraPreview(this, mCamera);
        FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
        preview.addView(mPreview);
    }
}

দ্রষ্টব্য: উপরের উদাহরণে getCameraInstance() পদ্ধতিটি Accessing cameras- এ দেখানো উদাহরণ পদ্ধতিকে নির্দেশ করে।

ছবি তোলা

একবার আপনি একটি প্রিভিউ ক্লাস এবং এটি প্রদর্শনের জন্য একটি ভিউ লেআউট তৈরি করে ফেললে, আপনি আপনার অ্যাপ্লিকেশন দিয়ে ছবি তোলা শুরু করতে প্রস্তুত। আপনার অ্যাপ্লিকেশন কোডে, আপনাকে শ্রোতাদের সেট আপ করতে হবে যাতে তারা ছবি তোলার মাধ্যমে ব্যবহারকারীর ক্রিয়াকলাপের প্রতিক্রিয়া জানাতে পারে।

ছবি উদ্ধার করতে, Camera.takePicture() পদ্ধতিটি ব্যবহার করুন। এই পদ্ধতিতে ক্যামেরা থেকে ডেটা গ্রহণকারী তিনটি প্যারামিটার ব্যবহার করা হয়। JPEG ফর্ম্যাটে ডেটা গ্রহণ করার জন্য, আপনাকে ছবির ডেটা গ্রহণ করতে এবং এটি একটি ফাইলে লিখতে একটি Camera.PictureCallback ইন্টারফেস প্রয়োগ করতে হবে। নিম্নলিখিত কোডটি ক্যামেরা থেকে প্রাপ্ত ছবি সংরক্ষণ করার জন্য Camera.PictureCallback ইন্টারফেসের একটি মৌলিক বাস্তবায়ন দেখায়।

কোটলিন

private val mPicture = Camera.PictureCallback { data, _ ->
    val pictureFile: File = getOutputMediaFile(MEDIA_TYPE_IMAGE) ?: run {
        Log.d(TAG, ("Error creating media file, check storage permissions"))
        return@PictureCallback
    }

    try {
        val fos = FileOutputStream(pictureFile)
        fos.write(data)
        fos.close()
    } catch (e: FileNotFoundException) {
        Log.d(TAG, "File not found: ${e.message}")
    } catch (e: IOException) {
        Log.d(TAG, "Error accessing file: ${e.message}")
    }
}

জাভা

private PictureCallback mPicture = new PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
        if (pictureFile == null){
            Log.d(TAG, "Error creating media file, check storage permissions");
            return;
        }

        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {
            Log.d(TAG, "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d(TAG, "Error accessing file: " + e.getMessage());
        }
    }
};

Camera.takePicture() পদ্ধতিটি কল করে একটি ছবি ক্যাপচার শুরু করুন। নিম্নলিখিত উদাহরণ কোডটি দেখায় কিভাবে View.OnClickListener বোতাম থেকে এই পদ্ধতিটি কল করতে হয়।

কোটলিন

val captureButton: Button = findViewById(R.id.button_capture)
captureButton.setOnClickListener {
    // get an image from the camera
    mCamera?.takePicture(null, null, picture)
}

জাভা

// Add a listener to the Capture button
Button captureButton = (Button) findViewById(R.id.button_capture);
captureButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // get an image from the camera
            mCamera.takePicture(null, null, picture);
        }
    }
);

দ্রষ্টব্য: নিম্নলিখিত উদাহরণে mPicture সদস্যটি উপরের উদাহরণ কোডটিকে নির্দেশ করে।

সাবধানতা: আপনার অ্যাপ্লিকেশনটি ব্যবহার করা শেষ হলে Camera.release() কল করে Camera অবজেক্টটি ছেড়ে দিতে ভুলবেন না! ক্যামেরাটি কীভাবে ছেড়ে দেবেন সে সম্পর্কে তথ্যের জন্য, ক্যামেরাটি ছেড়ে দেওয়া দেখুন।

ভিডিও ক্যাপচার করা হচ্ছে

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক ব্যবহার করে ভিডিও ক্যাপচারের জন্য Camera অবজেক্টের যত্ন সহকারে ব্যবস্থাপনা এবং MediaRecorder ক্লাসের সাথে সমন্বয় প্রয়োজন। Camera দিয়ে ভিডিও রেকর্ড করার সময়, Camera.open() এবং Camera.release() কলের পাশাপাশি MediaRecorder ক্যামেরা হার্ডওয়্যারে অ্যাক্সেস দেওয়ার জন্য Camera.lock() এবং Camera.unlock() Camera.release() ) কলগুলি পরিচালনা করতে হবে।

দ্রষ্টব্য: অ্যান্ড্রয়েড ৪.০ (এপিআই লেভেল ১৪) দিয়ে শুরু করে, Camera.lock() এবং Camera.unlock() কলগুলি আপনার জন্য স্বয়ংক্রিয়ভাবে পরিচালিত হয়।

ডিভাইস ক্যামেরা দিয়ে ছবি তোলার বিপরীতে, ভিডিও ক্যাপচার করার জন্য একটি নির্দিষ্ট কল অর্ডারের প্রয়োজন হয়। আপনার অ্যাপ্লিকেশনের মাধ্যমে ভিডিও ক্যাপচারের জন্য সফলভাবে প্রস্তুতি নিতে এবং ক্যাপচার করতে আপনাকে অবশ্যই একটি নির্দিষ্ট অর্ডার অনুসরণ করতে হবে, যা নীচে বিস্তারিতভাবে বর্ণনা করা হয়েছে।

  1. ক্যামেরা খুলুন - ক্যামেরা অবজেক্টের একটি উদাহরণ পেতে Camera.open() ব্যবহার করুন।
  2. কানেক্ট প্রিভিউ - Camera.setPreviewDisplay() ব্যবহার করে ক্যামেরার সাথে একটি SurfaceView সংযুক্ত করে একটি লাইভ ক্যামেরা ছবির প্রিভিউ প্রস্তুত করুন।
  3. প্রাকদর্শন শুরু করুন - লাইভ ক্যামেরার ছবি প্রদর্শন শুরু করতে Camera.startPreview() এ কল করুন।
  4. ভিডিও রেকর্ডিং শুরু করুন - সফলভাবে ভিডিও রেকর্ড করার জন্য নিম্নলিখিত ধাপগুলি সম্পন্ন করতে হবে:
    1. ক্যামেরা আনলক করুন - Camera.unlock() এ কল করে MediaRecorder ব্যবহারের জন্য ক্যামেরা আনলক করুন।
    2. মিডিয়ারেকর্ডার কনফিগার করুন - নিম্নলিখিত MediaRecorder পদ্ধতিগুলিকে এই ক্রমে কল করুন। আরও তথ্যের জন্য, MediaRecorder রেফারেন্স ডকুমেন্টেশন দেখুন।
      1. setCamera() - ভিডিও ক্যাপচারের জন্য ক্যামেরাটি সেট করুন, আপনার অ্যাপ্লিকেশনের বর্তমান Camera উদাহরণ ব্যবহার করুন।
      2. setAudioSource() - অডিও সোর্স সেট করুন, MediaRecorder.AudioSource.CAMCORDER ব্যবহার করুন।
      3. setVideoSource() - ভিডিও সোর্স সেট করুন, MediaRecorder.VideoSource.CAMERA ব্যবহার করুন।
      4. ভিডিও আউটপুট ফর্ম্যাট এবং এনকোডিং সেট করুন। অ্যান্ড্রয়েড ২.২ (এপিআই লেভেল ৮) এবং উচ্চতর সংস্করণের জন্য, MediaRecorder.setProfile পদ্ধতি ব্যবহার করুন এবং CamcorderProfile.get() ব্যবহার করে একটি প্রোফাইল ইনস্ট্যান্স পান। অ্যান্ড্রয়েড ২.২ এর পূর্ববর্তী সংস্করণের জন্য, আপনাকে ভিডিও আউটপুট ফর্ম্যাট এবং এনকোডিং প্যারামিটার সেট করতে হবে:
        1. setOutputFormat() - আউটপুট ফরম্যাট সেট করুন, ডিফল্ট সেটিং নির্দিষ্ট করুন অথবা MediaRecorder.OutputFormat.MPEG_4
        2. setAudioEncoder() - সাউন্ড এনকোডিং টাইপ সেট করুন, ডিফল্ট সেটিং নির্দিষ্ট করুন অথবা MediaRecorder.AudioEncoder.AMR_NB
        3. setVideoEncoder() - ভিডিও এনকোডিং টাইপ সেট করুন, ডিফল্ট সেটিং নির্দিষ্ট করুন অথবা MediaRecorder.VideoEncoder.MPEG_4_SP
      5. setOutputFile() - আউটপুট ফাইল সেট করার জন্য, Saving Media Files বিভাগে উদাহরণ পদ্ধতি থেকে getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() ব্যবহার করুন।
      6. setPreviewDisplay() - আপনার অ্যাপ্লিকেশনের জন্য SurfaceView প্রিভিউ লেআউট উপাদান নির্দিষ্ট করুন। Connect Preview এর জন্য আপনি যে অবজেক্টটি নির্দিষ্ট করেছেন তা ব্যবহার করুন।

      সতর্কতা: আপনাকে অবশ্যই এই MediaRecorder কনফিগারেশন পদ্ধতিগুলিকে এই ক্রমে কল করতে হবে, অন্যথায় আপনার অ্যাপ্লিকেশনে ত্রুটি দেখা দেবে এবং রেকর্ডিং ব্যর্থ হবে।

    3. মিডিয়ারেকর্ডার প্রস্তুত করুন - MediaRecorder.prepare() কল করে প্রদত্ত কনফিগারেশন সেটিংস সহ MediaRecorder প্রস্তুত করুন।
    4. MediaRecorder শুরু করুন - MediaRecorder.start() কল করে ভিডিও রেকর্ডিং শুরু করুন।
  5. ভিডিও রেকর্ডিং বন্ধ করুন - সফলভাবে ভিডিও রেকর্ডিং সম্পন্ন করার জন্য নিম্নলিখিত পদ্ধতিগুলি ব্যবহার করুন:
    1. MediaRecorder বন্ধ করুন - MediaRecorder.stop() কল করে ভিডিও রেকর্ডিং বন্ধ করুন।
    2. MediaRecorder রিসেট করুন - ঐচ্ছিকভাবে, MediaRecorder.reset() কল করে রেকর্ডার থেকে কনফিগারেশন সেটিংস সরান।
    3. মিডিয়ারেকর্ডার রিলিজ করুন - MediaRecorder.release() কল করে MediaRecorder রিলিজ করুন।
    4. ক্যামেরা লক করুন - ক্যামেরা লক করুন যাতে ভবিষ্যতের MediaRecorder সেশনগুলি Camera.lock() কল করে এটি ব্যবহার করতে পারে। Android 4.0 (API লেভেল 14) দিয়ে শুরু করে, MediaRecorder.prepare() কল ব্যর্থ না হলে এই কলটি প্রয়োজন হয় না।
  6. প্রিভিউ বন্ধ করুন - ক্যামেরা ব্যবহার করে আপনার কার্যকলাপ শেষ হয়ে গেলে, Camera.stopPreview() ব্যবহার করে প্রিভিউ বন্ধ করুন।
  7. ক্যামেরা রিলিজ করুন - ক্যামেরা রিলিজ করুন যাতে অন্যান্য অ্যাপ্লিকেশনগুলি Camera.release() কল করে এটি ব্যবহার করতে পারে।

দ্রষ্টব্য: প্রথমে ক্যামেরা প্রিভিউ তৈরি না করেই MediaRecorder ব্যবহার করা সম্ভব এবং এই প্রক্রিয়ার প্রথম কয়েকটি ধাপ এড়িয়ে যাওয়া সম্ভব। তবে, যেহেতু ব্যবহারকারীরা সাধারণত রেকর্ডিং শুরু করার আগে একটি প্রিভিউ দেখতে পছন্দ করেন, তাই সেই প্রক্রিয়াটি এখানে আলোচনা করা হয়নি।

টিপস: যদি আপনার অ্যাপ্লিকেশনটি সাধারণত ভিডিও রেকর্ডিংয়ের জন্য ব্যবহৃত হয়, তাহলে আপনার প্রিভিউ শুরু করার আগে setRecordingHint(boolean) কে true তে সেট করুন। এই সেটিং রেকর্ডিং শুরু করতে যে সময় লাগে তা কমাতে সাহায্য করতে পারে।

মিডিয়ারেকর্ডার কনফিগার করা হচ্ছে

ভিডিও রেকর্ড করার জন্য MediaRecorder ক্লাস ব্যবহার করার সময়, আপনাকে একটি নির্দিষ্ট ক্রমে কনফিগারেশন ধাপগুলি সম্পাদন করতে হবে এবং তারপর কনফিগারেশনটি পরীক্ষা এবং বাস্তবায়নের জন্য MediaRecorder.prepare() পদ্ধতিটি কল করতে হবে। নিম্নলিখিত উদাহরণ কোডটি ভিডিও রেকর্ডিংয়ের জন্য MediaRecorder ক্লাসটি কীভাবে সঠিকভাবে কনফিগার এবং প্রস্তুত করতে হয় তা দেখায়।

কোটলিন

private fun prepareVideoRecorder(): Boolean {
    mediaRecorder = MediaRecorder()

    mCamera?.let { camera ->
        // Step 1: Unlock and set camera to MediaRecorder
        camera?.unlock()

        mediaRecorder?.run {
            setCamera(camera)

            // Step 2: Set sources
            setAudioSource(MediaRecorder.AudioSource.CAMCORDER)
            setVideoSource(MediaRecorder.VideoSource.CAMERA)

            // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
            setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH))

            // Step 4: Set output file
            setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString())

            // Step 5: Set the preview output
            setPreviewDisplay(mPreview?.holder?.surface)

            setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
            setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT)
            setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT)


            // Step 6: Prepare configured MediaRecorder
            return try {
                prepare()
                true
            } catch (e: IllegalStateException) {
                Log.d(TAG, "IllegalStateException preparing MediaRecorder: ${e.message}")
                releaseMediaRecorder()
                false
            } catch (e: IOException) {
                Log.d(TAG, "IOException preparing MediaRecorder: ${e.message}")
                releaseMediaRecorder()
                false
            }
        }

    }
    return false
}

জাভা

private boolean prepareVideoRecorder(){

    mCamera = getCameraInstance();
    mediaRecorder = new MediaRecorder();

    // Step 1: Unlock and set camera to MediaRecorder
    mCamera.unlock();
    mediaRecorder.setCamera(mCamera);

    // Step 2: Set sources
    mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
    mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);

    // Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
    mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH));

    // Step 4: Set output file
    mediaRecorder.setOutputFile(getOutputMediaFile(MEDIA_TYPE_VIDEO).toString());

    // Step 5: Set the preview output
    mediaRecorder.setPreviewDisplay(mPreview.getHolder().getSurface());

    // Step 6: Prepare configured MediaRecorder
    try {
        mediaRecorder.prepare();
    } catch (IllegalStateException e) {
        Log.d(TAG, "IllegalStateException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    } catch (IOException e) {
        Log.d(TAG, "IOException preparing MediaRecorder: " + e.getMessage());
        releaseMediaRecorder();
        return false;
    }
    return true;
}

অ্যান্ড্রয়েড ২.২ (এপিআই লেভেল ৮) এর আগে, আপনাকে CamcorderProfile ব্যবহার না করে সরাসরি আউটপুট ফর্ম্যাট এবং এনকোডিং ফর্ম্যাট প্যারামিটার সেট করতে হবে। এই পদ্ধতিটি নিম্নলিখিত কোডে প্রদর্শিত হয়েছে:

কোটলিন

    // Step 3: Set output format and encoding (for versions prior to API Level 8)
    mediaRecorder?.apply {
        setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
        setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT)
        setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT)
    }

জাভা

    // Step 3: Set output format and encoding (for versions prior to API Level 8)
    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
    mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
    mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);

MediaRecorder জন্য নিম্নলিখিত ভিডিও রেকর্ডিং প্যারামিটারগুলিকে ডিফল্ট সেটিংস দেওয়া হয়, তবে, আপনি আপনার অ্যাপ্লিকেশনের জন্য এই সেটিংসগুলি সামঞ্জস্য করতে চাইতে পারেন:

MediaRecorder শুরু এবং বন্ধ করা

MediaRecorder ক্লাস ব্যবহার করে ভিডিও রেকর্ডিং শুরু এবং বন্ধ করার সময়, আপনাকে নীচে তালিকাভুক্ত একটি নির্দিষ্ট ক্রম অনুসরণ করতে হবে।

  1. Camera.unlock() দিয়ে ক্যামেরা আনলক করুন
  2. উপরের কোড উদাহরণে দেখানো MediaRecorder কনফিগার করুন
  3. MediaRecorder.start() ব্যবহার করে রেকর্ডিং শুরু করুন
  4. ভিডিওটি রেকর্ড করুন
  5. MediaRecorder.stop() ব্যবহার করে রেকর্ডিং বন্ধ করুন
  6. MediaRecorder.release() দিয়ে মিডিয়া রেকর্ডারটি রিলিজ করুন।
  7. Camera.lock() ব্যবহার করে ক্যামেরা লক করুন

নিচের উদাহরণ কোডটি ক্যামেরা এবং MediaRecorder ক্লাস ব্যবহার করে ভিডিও রেকর্ডিং সঠিকভাবে শুরু এবং বন্ধ করার জন্য একটি বোতাম কীভাবে সংযুক্ত করতে হয় তা দেখায়।

দ্রষ্টব্য: ভিডিও রেকর্ডিং সম্পন্ন করার সময়, ক্যামেরাটি ছেড়ে দেবেন না, অন্যথায় আপনার প্রিভিউ বন্ধ হয়ে যাবে।

কোটলিন

var isRecording = false
val captureButton: Button = findViewById(R.id.button_capture)
captureButton.setOnClickListener {
    if (isRecording) {
        // stop recording and release camera
        mediaRecorder?.stop() // stop the recording
        releaseMediaRecorder() // release the MediaRecorder object
        mCamera?.lock() // take camera access back from MediaRecorder

        // inform the user that recording has stopped
        setCaptureButtonText("Capture")
        isRecording = false
    } else {
        // initialize video camera
        if (prepareVideoRecorder()) {
            // Camera is available and unlocked, MediaRecorder is prepared,
            // now you can start recording
            mediaRecorder?.start()

            // inform the user that recording has started
            setCaptureButtonText("Stop")
            isRecording = true
        } else {
            // prepare didn't work, release the camera
            releaseMediaRecorder()
            // inform user
        }
    }
}

জাভা

private boolean isRecording = false;

// Add a listener to the Capture button
Button captureButton = (Button) findViewById(id.button_capture);
captureButton.setOnClickListener(
    new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isRecording) {
                // stop recording and release camera
                mediaRecorder.stop();  // stop the recording
                releaseMediaRecorder(); // release the MediaRecorder object
                mCamera.lock();         // take camera access back from MediaRecorder

                // inform the user that recording has stopped
                setCaptureButtonText("Capture");
                isRecording = false;
            } else {
                // initialize video camera
                if (prepareVideoRecorder()) {
                    // Camera is available and unlocked, MediaRecorder is prepared,
                    // now you can start recording
                    mediaRecorder.start();

                    // inform the user that recording has started
                    setCaptureButtonText("Stop");
                    isRecording = true;
                } else {
                    // prepare didn't work, release the camera
                    releaseMediaRecorder();
                    // inform user
                }
            }
        }
    }
);

দ্রষ্টব্য: উপরের উদাহরণে, prepareVideoRecorder() পদ্ধতিটি Configuring MediaRecorder- এ দেখানো উদাহরণ কোডকে বোঝায়। এই পদ্ধতিটি ক্যামেরা লক করা, MediaRecorder ইনস্ট্যান্স কনফিগার এবং প্রস্তুত করার যত্ন নেয়।

ক্যামেরাটি ছেড়ে দেওয়া হচ্ছে

ক্যামেরা হলো এমন একটি রিসোর্স যা ডিভাইসে থাকা অ্যাপ্লিকেশনগুলি দ্বারা ভাগ করা হয়। আপনার অ্যাপ্লিকেশনটি Camera একটি উদাহরণ পাওয়ার পরে ক্যামেরাটি ব্যবহার করতে পারে এবং আপনার অ্যাপ্লিকেশনটি যখন এটি ব্যবহার বন্ধ করে দেয় এবং আপনার অ্যাপ্লিকেশনটি বিরতি দেওয়ার সাথে সাথে ক্যামেরা অবজেক্টটি ছেড়ে দেওয়ার জন্য আপনাকে বিশেষভাবে সতর্ক থাকতে হবে ( Activity.onPause() )। যদি আপনার অ্যাপ্লিকেশনটি সঠিকভাবে ক্যামেরাটি ছেড়ে না দেয়, তাহলে ক্যামেরা অ্যাক্সেস করার পরবর্তী সমস্ত প্রচেষ্টা, আপনার নিজস্ব অ্যাপ্লিকেশন সহ, ব্যর্থ হবে এবং আপনার বা অন্যান্য অ্যাপ্লিকেশনগুলি বন্ধ করে দিতে পারে।

Camera অবজেক্টের একটি ইনস্ট্যান্স প্রকাশ করতে, নীচের উদাহরণ কোডে দেখানো Camera.release() পদ্ধতিটি ব্যবহার করুন।

কোটলিন

class CameraActivity : Activity() {
    private var mCamera: Camera?
    private var preview: SurfaceView?
    private var mediaRecorder: MediaRecorder?

    override fun onPause() {
        super.onPause()
        releaseMediaRecorder() // if you are using MediaRecorder, release it first
        releaseCamera() // release the camera immediately on pause event
    }

    private fun releaseMediaRecorder() {
        mediaRecorder?.reset() // clear recorder configuration
        mediaRecorder?.release() // release the recorder object
        mediaRecorder = null
        mCamera?.lock() // lock camera for later use
    }

    private fun releaseCamera() {
        mCamera?.release() // release the camera for other applications
        mCamera = null
    }
}

জাভা

public class CameraActivity extends Activity {
    private Camera mCamera;
    private SurfaceView preview;
    private MediaRecorder mediaRecorder;

    ...

    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaRecorder();       // if you are using MediaRecorder, release it first
        releaseCamera();              // release the camera immediately on pause event
    }

    private void releaseMediaRecorder(){
        if (mediaRecorder != null) {
            mediaRecorder.reset();   // clear recorder configuration
            mediaRecorder.release(); // release the recorder object
            mediaRecorder = null;
            mCamera.lock();           // lock camera for later use
        }
    }

    private void releaseCamera(){
        if (mCamera != null){
            mCamera.release();        // release the camera for other applications
            mCamera = null;
        }
    }
}

সতর্কতা: যদি আপনার অ্যাপ্লিকেশনটি ক্যামেরাটি সঠিকভাবে প্রকাশ না করে, তাহলে ক্যামেরা অ্যাক্সেস করার পরবর্তী সমস্ত প্রচেষ্টা, আপনার নিজস্ব অ্যাপ্লিকেশন সহ, ব্যর্থ হবে এবং আপনার বা অন্যান্য অ্যাপ্লিকেশনগুলি বন্ধ করে দিতে পারে।

মিডিয়া ফাইল সংরক্ষণ করা হচ্ছে

ব্যবহারকারীদের দ্বারা তৈরি করা ছবি এবং ভিডিওর মতো মিডিয়া ফাইলগুলি ডিভাইসের বহিরাগত স্টোরেজ ডিরেক্টরিতে (SD কার্ড) সংরক্ষণ করা উচিত যাতে সিস্টেমের স্থান সংরক্ষণ করা যায় এবং ব্যবহারকারীরা তাদের ডিভাইস ছাড়াই এই ফাইলগুলি অ্যাক্সেস করতে পারে। একটি ডিভাইসে মিডিয়া ফাইলগুলি সংরক্ষণ করার জন্য অনেকগুলি সম্ভাব্য ডিরেক্টরি অবস্থান রয়েছে, তবে একজন বিকাশকারী হিসাবে আপনার বিবেচনা করা উচিত মাত্র দুটি স্ট্যান্ডার্ড অবস্থান:

  • Environment.getExternalStoragePublicDirectory ( Environment.DIRECTORY_PICTURES ) - এই পদ্ধতিটি ছবি এবং ভিডিও সংরক্ষণের জন্য স্ট্যান্ডার্ড, শেয়ার করা এবং প্রস্তাবিত অবস্থান ফেরত দেয়। এই ডিরেক্টরিটি শেয়ার করা (পাবলিক), তাই অন্যান্য অ্যাপ্লিকেশনগুলি সহজেই এই অবস্থানে সংরক্ষিত ফাইলগুলি আবিষ্কার করতে, পড়তে, পরিবর্তন করতে এবং মুছে ফেলতে পারে। যদি আপনার অ্যাপ্লিকেশনটি ব্যবহারকারী দ্বারা আনইনস্টল করা হয়, তাহলে এই অবস্থানে সংরক্ষিত মিডিয়া ফাইলগুলি সরানো হবে না। ব্যবহারকারীদের বিদ্যমান ছবি এবং ভিডিওগুলিতে হস্তক্ষেপ এড়াতে, আপনার অ্যাপ্লিকেশনের মিডিয়া ফাইলগুলির জন্য এই ডিরেক্টরির মধ্যে একটি সাব-ডিরেক্টরি তৈরি করা উচিত, যেমনটি নীচের কোড নমুনায় দেখানো হয়েছে। এই পদ্ধতিটি Android 2.2 (API লেভেল 8) এ উপলব্ধ, পূর্ববর্তী API সংস্করণগুলিতে সমতুল্য কলগুলির জন্য, শেয়ার করা ফাইলগুলি সংরক্ষণ করা দেখুন।
  • Context.getExternalFilesDir ( Environment.DIRECTORY_PICTURES ) - এই পদ্ধতিটি আপনার অ্যাপ্লিকেশনের সাথে সম্পর্কিত ছবি এবং ভিডিও সংরক্ষণের জন্য একটি আদর্শ অবস্থান প্রদান করে। যদি আপনার অ্যাপ্লিকেশনটি আনইনস্টল করা হয়, তাহলে এই অবস্থানে সংরক্ষিত যেকোনো ফাইল মুছে ফেলা হবে। এই অবস্থানের ফাইলগুলির জন্য সুরক্ষা প্রয়োগ করা হয় না এবং অন্যান্য অ্যাপ্লিকেশনগুলি সেগুলি পড়তে, পরিবর্তন করতে এবং মুছে ফেলতে পারে।

নিম্নলিখিত উদাহরণ কোডটি দেখায় যে কীভাবে একটি মিডিয়া ফাইলের জন্য একটি File বা Uri অবস্থান তৈরি করতে হয় যা একটি ডিভাইসের ক্যামেরাকে Intent দিয়ে ব্যবহার করার সময় বা একটি ক্যামেরা অ্যাপ তৈরির অংশ হিসাবে ব্যবহার করা যেতে পারে।

কোটলিন

val MEDIA_TYPE_IMAGE = 1
val MEDIA_TYPE_VIDEO = 2

/** Create a file Uri for saving an image or video */
private fun getOutputMediaFileUri(type: Int): Uri {
    return Uri.fromFile(getOutputMediaFile(type))
}

/** Create a File for saving an image or video */
private fun getOutputMediaFile(type: Int): File? {
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    val mediaStorageDir = File(
            Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            "MyCameraApp"
    )
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    mediaStorageDir.apply {
        if (!exists()) {
            if (!mkdirs()) {
                Log.d("MyCameraApp", "failed to create directory")
                return null
            }
        }
    }

    // Create a media file name
    val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss").format(Date())
    return when (type) {
        MEDIA_TYPE_IMAGE -> {
            File("${mediaStorageDir.path}${File.separator}IMG_$timeStamp.jpg")
        }
        MEDIA_TYPE_VIDEO -> {
            File("${mediaStorageDir.path}${File.separator}VID_$timeStamp.mp4")
        }
        else -> null
    }
}

জাভা

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

/** Create a file Uri for saving an image or video */
private static Uri getOutputMediaFileUri(int type){
      return Uri.fromFile(getOutputMediaFile(type));
}

/** Create a File for saving an image or video */
private static File getOutputMediaFile(int type){
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
              Environment.DIRECTORY_PICTURES), "MyCameraApp");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.

    // Create the storage directory if it does not exist
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "IMG_"+ timeStamp + ".jpg");
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "VID_"+ timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

দ্রষ্টব্য: Environment.getExternalStoragePublicDirectory() অ্যান্ড্রয়েড ২.২ (এপিআই লেভেল ৮) বা তার উচ্চতর সংস্করণে উপলব্ধ। যদি আপনি অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলির ডিভাইসগুলিকে লক্ষ্য করে থাকেন, তাহলে Environment.getExternalStorageDirectory() ব্যবহার করুন। আরও তথ্যের জন্য, শেয়ার করা ফাইল সংরক্ষণ দেখুন।

URI সাপোর্টকে কার্যকরী প্রোফাইলে রূপান্তর করতে, প্রথমে URI ফাইলটিকে একটি content URI তে রূপান্তর করুন । তারপর, একটি Intent এর EXTRA_OUTPUT তে content URI যোগ করুন।

অ্যান্ড্রয়েড ডিভাইসে ফাইল সংরক্ষণ সম্পর্কে আরও তথ্যের জন্য, ডেটা স্টোরেজ দেখুন।

ক্যামেরা বৈশিষ্ট্য

অ্যান্ড্রয়েড আপনার ক্যামেরা অ্যাপ্লিকেশনের মাধ্যমে নিয়ন্ত্রণ করতে পারেন এমন বিভিন্ন ধরণের ক্যামেরা বৈশিষ্ট্য সমর্থন করে, যেমন ছবি বিন্যাস, ফ্ল্যাশ মোড, ফোকাস সেটিংস এবং আরও অনেক কিছু। এই বিভাগে সাধারণ ক্যামেরা বৈশিষ্ট্যগুলি তালিকাভুক্ত করা হয়েছে এবং সেগুলি কীভাবে ব্যবহার করবেন তা সংক্ষেপে আলোচনা করা হয়েছে। বেশিরভাগ ক্যামেরা বৈশিষ্ট্যগুলি through Camera.Parameters অবজেক্ট ব্যবহার করে অ্যাক্সেস এবং সেট করা যেতে পারে। তবে, Camera.Parameters এ বেশ কয়েকটি গুরুত্বপূর্ণ বৈশিষ্ট্য রয়েছে যার জন্য সাধারণ সেটিংসের চেয়েও বেশি কিছু প্রয়োজন। এই বৈশিষ্ট্যগুলি নিম্নলিখিত বিভাগগুলিতে কভার করা হয়েছে:

Camera.Parameters এর মাধ্যমে নিয়ন্ত্রিত বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করবেন সে সম্পর্কে সাধারণ তথ্যের জন্য, Using camera features বিভাগটি পর্যালোচনা করুন। ক্যামেরা প্যারামিটার অবজেক্টের মাধ্যমে নিয়ন্ত্রিত বৈশিষ্ট্যগুলি কীভাবে ব্যবহার করবেন সে সম্পর্কে আরও বিস্তারিত তথ্যের জন্য, API রেফারেন্স ডকুমেন্টেশনের নীচের বৈশিষ্ট্য তালিকার লিঙ্কগুলি অনুসরণ করুন।

সারণী ১। সাধারণ ক্যামেরা বৈশিষ্ট্যগুলি অ্যান্ড্রয়েড এপিআই স্তর অনুসারে সাজানো হয়েছে যেখানে সেগুলি চালু করা হয়েছিল।

বৈশিষ্ট্য এপিআই লেভেল বিবরণ
মুখ সনাক্তকরণ ১৪ ছবির মধ্যে মানুষের মুখ শনাক্ত করুন এবং ফোকাস, মিটারিং এবং হোয়াইট ব্যালেন্সের জন্য সেগুলি ব্যবহার করুন
মিটারিং এলাকা ১৪ সাদা ভারসাম্য গণনার জন্য একটি ছবির মধ্যে এক বা একাধিক এলাকা নির্দিষ্ট করুন
ফোকাস এরিয়া ১৪ ফোকাসের জন্য একটি ছবির মধ্যে এক বা একাধিক এলাকা সেট করুন
White Balance Lock ১৪ স্বয়ংক্রিয় হোয়াইট ব্যালেন্স সমন্বয় বন্ধ করুন বা শুরু করুন
Exposure Lock ১৪ স্বয়ংক্রিয় এক্সপোজার সমন্বয় বন্ধ করুন বা শুরু করুন
Video Snapshot ১৪ ভিডিও শ্যুট করার সময় একটি ছবি তুলুন (ফ্রেম গ্র্যাব)
টাইম ল্যাপস ভিডিও ১১ টাইম ল্যাপস ভিডিও রেকর্ড করার জন্য নির্ধারিত বিলম্ব সহ ফ্রেম রেকর্ড করুন
Multiple Cameras একটি ডিভাইসে একাধিক ক্যামেরার জন্য সমর্থন, যার মধ্যে সামনের এবং পিছনের ক্যামেরাও অন্তর্ভুক্ত।
Focus Distance ক্যামেরা এবং ফোকাসে থাকা বস্তুর মধ্যে দূরত্ব রিপোর্ট করে।
Zoom ছবির বিবর্ধন সেট করুন
Exposure Compensation আলোর এক্সপোজারের মাত্রা বাড়ান বা হ্রাস করুন
GPS Data ছবির সাথে ভৌগোলিক অবস্থানের তথ্য অন্তর্ভুক্ত করুন বা বাদ দিন
White Balance হোয়াইট ব্যালেন্স মোড সেট করুন, যা ক্যাপচার করা ছবিতে রঙের মানকে প্রভাবিত করে।
Focus Mode স্বয়ংক্রিয়, স্থির, ম্যাক্রো বা ইনফিনিটির মতো কোনও বিষয়ের উপর ক্যামেরা কীভাবে ফোকাস করবে তা সেট করুন
Scene Mode রাত, সমুদ্র সৈকত, তুষার বা মোমবাতির আলোর দৃশ্যের মতো নির্দিষ্ট ধরণের ফটোগ্রাফি পরিস্থিতির জন্য একটি প্রিসেট মোড প্রয়োগ করুন।
JPEG Quality একটি JPEG ছবির জন্য কম্প্রেশন লেভেল সেট করুন, যা ছবির আউটপুট ফাইলের মান এবং আকার বৃদ্ধি বা হ্রাস করে।
Flash Mode ফ্ল্যাশ চালু, বন্ধ করুন, অথবা স্বয়ংক্রিয় সেটিং ব্যবহার করুন
Color Effects ক্যাপচার করা ছবিতে কালো এবং সাদা, সেপিয়া টোন বা নেতিবাচক রঙের প্রভাব প্রয়োগ করুন।
Anti-Banding JPEG কম্প্রেশনের কারণে রঙের গ্রেডিয়েন্টে ব্যান্ডিংয়ের প্রভাব হ্রাস করে।
Picture Format ছবির জন্য ফাইল ফর্ম্যাট নির্দিষ্ট করুন।
Picture Size সংরক্ষিত ছবির পিক্সেল মাত্রা নির্দিষ্ট করুন

দ্রষ্টব্য: হার্ডওয়্যার পার্থক্য এবং সফ্টওয়্যার বাস্তবায়নের কারণে এই বৈশিষ্ট্যগুলি সমস্ত ডিভাইসে সমর্থিত নয়। আপনার অ্যাপ্লিকেশনটি যে ডিভাইসে চলছে সেখানে বৈশিষ্ট্যগুলির প্রাপ্যতা পরীক্ষা করার তথ্যের জন্য, বৈশিষ্ট্যের প্রাপ্যতা পরীক্ষা করা দেখুন।

বৈশিষ্ট্যের উপলভ্যতা পরীক্ষা করা হচ্ছে

অ্যান্ড্রয়েড ডিভাইসে ক্যামেরা বৈশিষ্ট্য ব্যবহার করার সময় প্রথমেই বুঝতে হবে যে সমস্ত ক্যামেরা বৈশিষ্ট্য সমস্ত ডিভাইসে সমর্থিত নয়। এছাড়াও, যে ডিভাইসগুলি একটি নির্দিষ্ট বৈশিষ্ট্য সমর্থন করে সেগুলি বিভিন্ন স্তরে বা বিভিন্ন বিকল্প সহ সমর্থন করতে পারে। অতএব, ক্যামেরা অ্যাপ্লিকেশন তৈরি করার সময় আপনার সিদ্ধান্ত প্রক্রিয়ার একটি অংশ হল আপনি কোন ক্যামেরা বৈশিষ্ট্যগুলি সমর্থন করতে চান এবং কোন স্তরে তা নির্ধারণ করা। এই সিদ্ধান্ত নেওয়ার পরে, আপনার ক্যামেরা অ্যাপ্লিকেশনে কোড অন্তর্ভুক্ত করার পরিকল্পনা করা উচিত যা পরীক্ষা করে দেখে যে ডিভাইস হার্ডওয়্যার সেই বৈশিষ্ট্যগুলি সমর্থন করে কিনা এবং যদি কোনও বৈশিষ্ট্য উপলব্ধ না থাকে তবে সুন্দরভাবে ব্যর্থ হয়।

আপনি ক্যামেরার প্যারামিটার অবজেক্টের একটি উদাহরণ পেয়ে এবং প্রাসঙ্গিক পদ্ধতিগুলি পরীক্ষা করে ক্যামেরা বৈশিষ্ট্যগুলির প্রাপ্যতা পরীক্ষা করতে পারেন। নিম্নলিখিত কোড নমুনা আপনাকে দেখায় কিভাবে একটি Camera.Parameters অবজেক্ট পাবেন এবং ক্যামেরাটি অটোফোকাস বৈশিষ্ট্য সমর্থন করে কিনা তা পরীক্ষা করুন:

কোটলিন

val params: Camera.Parameters? = camera?.parameters
val focusModes: List<String>? = params?.supportedFocusModes
if (focusModes?.contains(Camera.Parameters.FOCUS_MODE_AUTO) == true) {
    // Autofocus mode is supported
}

জাভা

// get Camera parameters
Camera.Parameters params = camera.getParameters();

List<String> focusModes = params.getSupportedFocusModes();
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
  // Autofocus mode is supported
}

বেশিরভাগ ক্যামেরা বৈশিষ্ট্যের জন্য আপনি উপরে দেখানো কৌশলটি ব্যবহার করতে পারেন। Camera.Parameters অবজেক্টটি একটি getSupported...() , is...Supported() অথবা getMax...() পদ্ধতি প্রদান করে যা নির্ধারণ করে যে কোনও বৈশিষ্ট্য (এবং কতটা) সমর্থিত।

যদি আপনার অ্যাপ্লিকেশনটির সঠিকভাবে কাজ করার জন্য কিছু ক্যামেরা বৈশিষ্ট্যের প্রয়োজন হয়, তাহলে আপনি আপনার অ্যাপ্লিকেশন ম্যানিফেস্টে কিছু সংযোজনের মাধ্যমে সেগুলি প্রয়োজন করতে পারেন। যখন আপনি ফ্ল্যাশ এবং অটো-ফোকাসের মতো নির্দিষ্ট ক্যামেরা বৈশিষ্ট্যগুলির ব্যবহার ঘোষণা করেন, তখন Google Play আপনার অ্যাপ্লিকেশনটিকে এমন ডিভাইসগুলিতে ইনস্টল করা থেকে বিরত রাখে যেগুলি এই বৈশিষ্ট্যগুলিকে সমর্থন করে না। আপনার অ্যাপ ম্যানিফেস্টে ঘোষিত ক্যামেরা বৈশিষ্ট্যগুলির একটি তালিকার জন্য, ম্যানিফেস্ট বৈশিষ্ট্য রেফারেন্স দেখুন।

ক্যামেরা বৈশিষ্ট্য ব্যবহার করা

Most camera features are activated and controlled using a Camera.Parameters object. You obtain this object by first getting an instance of the Camera object, calling the getParameters() method, changing the returned parameter object and then setting it back into the camera object, as demonstrated in the following example code:

কোটলিন

val params: Camera.Parameters? = camera?.parameters
params?.focusMode = Camera.Parameters.FOCUS_MODE_AUTO
camera?.parameters = params

জাভা

// get Camera parameters
Camera.Parameters params = camera.getParameters();
// set the focus mode
params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
// set Camera parameters
camera.setParameters(params);

এই কৌশলটি প্রায় সকল ক্যামেরা বৈশিষ্ট্যের জন্য কাজ করে এবং Camera অবজেক্টের একটি উদাহরণ পাওয়ার পরে বেশিরভাগ প্যারামিটার যেকোনো সময় পরিবর্তন করা যেতে পারে। প্যারামিটারের পরিবর্তনগুলি সাধারণত অ্যাপ্লিকেশনের ক্যামেরা প্রিভিউতে ব্যবহারকারীর কাছে তাৎক্ষণিকভাবে দৃশ্যমান হয়। সফ্টওয়্যারের দিক থেকে, ক্যামেরা হার্ডওয়্যার নতুন নির্দেশাবলী প্রক্রিয়া করার পরে এবং তারপরে আপডেট করা চিত্র ডেটা পাঠানোর সময় প্যারামিটার পরিবর্তনগুলি কার্যকর হতে বেশ কয়েকটি ফ্রেম লাগতে পারে।

গুরুত্বপূর্ণ: কিছু ক্যামেরার বৈশিষ্ট্য ইচ্ছামত পরিবর্তন করা যায় না। বিশেষ করে, ক্যামেরা প্রিভিউয়ের আকার বা ওরিয়েন্টেশন পরিবর্তন করার জন্য আপনাকে প্রথমে প্রিভিউ বন্ধ করতে হবে, প্রিভিউ আকার পরিবর্তন করতে হবে এবং তারপর প্রিভিউ পুনরায় চালু করতে হবে। অ্যান্ড্রয়েড 4.0 (API লেভেল 14) দিয়ে শুরু করে প্রিভিউ রিস্টার্ট না করেও প্রিভিউ ওরিয়েন্টেশন পরিবর্তন করা যেতে পারে।

অন্যান্য ক্যামেরা বৈশিষ্ট্যগুলি বাস্তবায়নের জন্য আরও কোডের প্রয়োজন, যার মধ্যে রয়েছে:

  • মিটারিং এবং ফোকাস এরিয়া
  • মুখ সনাক্তকরণ
  • টাইম ল্যাপস ভিডিও

এই বৈশিষ্ট্যগুলি কীভাবে বাস্তবায়ন করা যায় তার একটি দ্রুত রূপরেখা নিম্নলিখিত বিভাগগুলিতে দেওয়া হয়েছে।

মিটারিং এবং ফোকাস এরিয়া

কিছু ফটোগ্রাফিক পরিস্থিতিতে, স্বয়ংক্রিয় ফোকাসিং এবং আলোর পরিমাপ কাঙ্ক্ষিত ফলাফল নাও দিতে পারে। অ্যান্ড্রয়েড 4.0 (API লেভেল 14) দিয়ে শুরু করে, আপনার ক্যামেরা অ্যাপ্লিকেশন অতিরিক্ত নিয়ন্ত্রণ প্রদান করতে পারে যা আপনার অ্যাপ বা ব্যবহারকারীদের ফোকাস বা আলোর স্তরের সেটিংস নির্ধারণের জন্য একটি ছবিতে এলাকা নির্দিষ্ট করতে এবং ছবি বা ভিডিও ক্যাপচার করার জন্য এই মানগুলি ক্যামেরা হার্ডওয়্যারে প্রেরণ করতে দেয়।

মিটারিং এবং ফোকাসের জন্য এরিয়াগুলি অন্যান্য ক্যামেরা বৈশিষ্ট্যের মতোই কাজ করে, যেখানে আপনি Camera.Parameters অবজেক্টের পদ্ধতির মাধ্যমে এগুলি নিয়ন্ত্রণ করেন। নিম্নলিখিত কোডটি Camera এর একটি উদাহরণের জন্য দুটি লাইট মিটারিং এরিয়া সেট করার প্রদর্শন করে:

কোটলিন

// Create an instance of Camera
camera = getCameraInstance()

// set Camera parameters
val params: Camera.Parameters? = camera?.parameters

params?.apply {
    if (maxNumMeteringAreas > 0) { // check that metering areas are supported
        meteringAreas = ArrayList<Camera.Area>().apply {
            val areaRect1 = Rect(-100, -100, 100, 100) // specify an area in center of image
            add(Camera.Area(areaRect1, 600)) // set weight to 60%
            val areaRect2 = Rect(800, -1000, 1000, -800) // specify an area in upper right of image
            add(Camera.Area(areaRect2, 400)) // set weight to 40%
        }
    }
    camera?.parameters = this
}

জাভা

// Create an instance of Camera
camera = getCameraInstance();

// set Camera parameters
Camera.Parameters params = camera.getParameters();

if (params.getMaxNumMeteringAreas() > 0){ // check that metering areas are supported
    List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();

    Rect areaRect1 = new Rect(-100, -100, 100, 100);    // specify an area in center of image
    meteringAreas.add(new Camera.Area(areaRect1, 600)); // set weight to 60%
    Rect areaRect2 = new Rect(800, -1000, 1000, -800);  // specify an area in upper right of image
    meteringAreas.add(new Camera.Area(areaRect2, 400)); // set weight to 40%
    params.setMeteringAreas(meteringAreas);
}

camera.setParameters(params);

Camera.Area অবজেক্টে দুটি ডেটা প্যারামিটার থাকে: ক্যামেরার ভিউ ফিল্ডের মধ্যে একটি এলাকা নির্দিষ্ট করার জন্য একটি Rect অবজেক্ট এবং একটি ওজন মান, যা ক্যামেরাকে বলে যে আলোর মিটারিং বা ফোকাস গণনায় এই এলাকাটিকে কতটা গুরুত্ব দেওয়া উচিত।

Camera.Area অবজেক্টের Rect ক্ষেত্রটি 2000 x 2000 ইউনিট গ্রিডে ম্যাপ করা একটি আয়তক্ষেত্রাকার আকৃতি বর্ণনা করে। স্থানাঙ্ক -1000, -1000 ক্যামেরা ছবির উপরের, বাম কোণাকে প্রতিনিধিত্ব করে এবং স্থানাঙ্ক 1000, 1000 ক্যামেরা ছবির নীচে, ডান কোণাকে প্রতিনিধিত্ব করে, যেমনটি নীচের চিত্রে দেখানো হয়েছে।

চিত্র ১. লাল রেখাগুলি ক্যামেরা প্রিভিউয়ের মধ্যে একটি Camera.Area নির্দিষ্ট করার জন্য স্থানাঙ্ক ব্যবস্থা চিত্রিত করে। নীল বাক্সটি Rect মান 333,333,667,667 সহ একটি ক্যামেরা এলাকার অবস্থান এবং আকৃতি দেখায়।

এই স্থানাঙ্ক সিস্টেমের সীমানা সর্বদা ক্যামেরা প্রিভিউতে দৃশ্যমান ছবির বাইরের প্রান্তের সাথে মিলে যায় এবং জুম স্তরের সাথে সঙ্কুচিত বা প্রসারিত হয় না। একইভাবে, Camera.setDisplayOrientation() ব্যবহার করে ছবির প্রিভিউ ঘোরানোর ফলে স্থানাঙ্ক সিস্টেমটি পুনঃম্যাপ হয় না।

মুখ সনাক্তকরণ

যেসব ছবিতে মানুষ থাকে, তাদের মুখ সাধারণত ছবির সবচেয়ে গুরুত্বপূর্ণ অংশ হয় এবং ছবি তোলার সময় ফোকাস এবং হোয়াইট ব্যালেন্স উভয়ই নির্ধারণের জন্য এটি ব্যবহার করা উচিত। অ্যান্ড্রয়েড ৪.০ (এপিআই লেভেল ১৪) ফ্রেমওয়ার্ক মুখ শনাক্তকরণ প্রযুক্তি ব্যবহার করে মুখ শনাক্তকরণ এবং ছবির সেটিংস গণনা করার জন্য API প্রদান করে।

দ্রষ্টব্য: মুখ সনাক্তকরণ বৈশিষ্ট্যটি চালু থাকাকালীন, setWhiteBalance(String) , setFocusAreas(List<Camera.Area>) এবং setMeteringAreas(List<Camera.Area>) কোনও প্রভাব নেই।

আপনার ক্যামেরা অ্যাপ্লিকেশনে মুখ সনাক্তকরণ বৈশিষ্ট্যটি ব্যবহার করার জন্য কয়েকটি সাধারণ পদক্ষেপের প্রয়োজন:

  • ডিভাইসে ফেস ডিটেকশন সমর্থিত কিনা তা পরীক্ষা করুন
  • একটি ফেস ডিটেকশন লিসেনার তৈরি করুন
  • আপনার ক্যামেরা অবজেক্টে ফেস ডিটেকশন লিসেনার যোগ করুন
  • প্রিভিউয়ের পরে মুখ সনাক্তকরণ শুরু করুন (এবং প্রতিটি প্রিভিউ পুনরায় চালু করার পরে)

মুখ সনাক্তকরণ বৈশিষ্ট্যটি সকল ডিভাইসে সমর্থিত নয়। আপনি getMaxNumDetectedFaces() কল করে এই বৈশিষ্ট্যটি সমর্থিত কিনা তা পরীক্ষা করতে পারেন। এই পরীক্ষার একটি উদাহরণ নীচের startFaceDetection() নমুনা পদ্ধতিতে দেখানো হয়েছে।

মুখ সনাক্তকরণের বিজ্ঞপ্তি পেতে এবং প্রতিক্রিয়া জানাতে, আপনার ক্যামেরা অ্যাপ্লিকেশনটিকে মুখ সনাক্তকরণ ইভেন্টগুলির জন্য একটি শ্রোতা সেট করতে হবে। এটি করার জন্য, আপনাকে একটি শ্রোতা ক্লাস তৈরি করতে হবে যা নীচের উদাহরণ কোডে দেখানো Camera.FaceDetectionListener ইন্টারফেসটি বাস্তবায়ন করে।

কোটলিন

internal class MyFaceDetectionListener : Camera.FaceDetectionListener {

    override fun onFaceDetection(faces: Array<Camera.Face>, camera: Camera) {
        if (faces.isNotEmpty()) {
            Log.d("FaceDetection", ("face detected: ${faces.size}" +
                    " Face 1 Location X: ${faces[0].rect.centerX()}" +
                    "Y: ${faces[0].rect.centerY()}"))
        }
    }
}

জাভা

class MyFaceDetectionListener implements Camera.FaceDetectionListener {

    @Override
    public void onFaceDetection(Face[] faces, Camera camera) {
        if (faces.length > 0){
            Log.d("FaceDetection", "face detected: "+ faces.length +
                    " Face 1 Location X: " + faces[0].rect.centerX() +
                    "Y: " + faces[0].rect.centerY() );
        }
    }
}

এই ক্লাসটি তৈরি করার পরে, আপনি এটিকে আপনার অ্যাপ্লিকেশনের Camera অবজেক্টে সেট করুন, যেমনটি নীচের উদাহরণ কোডে দেখানো হয়েছে:

কোটলিন

camera?.setFaceDetectionListener(MyFaceDetectionListener())

জাভা

camera.setFaceDetectionListener(new MyFaceDetectionListener());

ক্যামেরা প্রিভিউ শুরু করার (অথবা পুনরায় চালু করার) সময় আপনার অ্যাপ্লিকেশনটিকে অবশ্যই ফেস ডিটেকশন ফাংশনটি শুরু করতে হবে। ফেস ডিটেকশন শুরু করার জন্য একটি পদ্ধতি তৈরি করুন যাতে আপনি প্রয়োজন অনুসারে এটি কল করতে পারেন, যেমনটি নীচের উদাহরণ কোডে দেখানো হয়েছে।

কোটলিন

fun startFaceDetection() {
    // Try starting Face Detection
    val params = mCamera?.parameters
    // start face detection only *after* preview has started

    params?.apply {
        if (maxNumDetectedFaces > 0) {
            // camera supports face detection, so can start it:
            mCamera?.startFaceDetection()
        }
    }
}

জাভা

public void startFaceDetection(){
    // Try starting Face Detection
    Camera.Parameters params = mCamera.getParameters();

    // start face detection only *after* preview has started
    if (params.getMaxNumDetectedFaces() > 0){
        // camera supports face detection, so can start it:
        mCamera.startFaceDetection();
    }
}

You must start face detection each time you start (or restart) the camera preview. If you use the preview class shown in Creating a preview class , add your startFaceDetection() method to both the surfaceCreated() and surfaceChanged() methods in your preview class, as shown in the sample code below.

কোটলিন

override fun surfaceCreated(holder: SurfaceHolder) {
    try {
        mCamera.setPreviewDisplay(holder)
        mCamera.startPreview()

        startFaceDetection() // start face detection feature
    } catch (e: IOException) {
        Log.d(TAG, "Error setting camera preview: ${e.message}")
    }
}

override fun surfaceChanged(holder: SurfaceHolder, format: Int, w: Int, h: Int) {
    if (holder.surface == null) {
        // preview surface does not exist
        Log.d(TAG, "holder.getSurface() == null")
        return
    }
    try {
        mCamera.stopPreview()
    } catch (e: Exception) {
        // ignore: tried to stop a non-existent preview
        Log.d(TAG, "Error stopping camera preview: ${e.message}")
    }
    try {
        mCamera.setPreviewDisplay(holder)
        mCamera.startPreview()

        startFaceDetection() // re-start face detection feature
    } catch (e: Exception) {
        // ignore: tried to stop a non-existent preview
        Log.d(TAG, "Error starting camera preview: ${e.message}")
    }
}

জাভা

public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();

        startFaceDetection(); // start face detection feature

    } catch (IOException e) {
        Log.d(TAG, "Error setting camera preview: " + e.getMessage());
    }
}

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {

    if (holder.getSurface() == null){
        // preview surface does not exist
        Log.d(TAG, "holder.getSurface() == null");
        return;
    }

    try {
        mCamera.stopPreview();

    } catch (Exception e){
        // ignore: tried to stop a non-existent preview
        Log.d(TAG, "Error stopping camera preview: " + e.getMessage());
    }

    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();

        startFaceDetection(); // re-start face detection feature

    } catch (Exception e){
        // ignore: tried to stop a non-existent preview
        Log.d(TAG, "Error starting camera preview: " + e.getMessage());
    }
}

Note: Remember to call this method after calling startPreview() . Do not attempt to start face detection in the onCreate() method of your camera app's main activity, as the preview is not available by this point in your application's the execution.

Time lapse video

Time lapse video allows users to create video clips that combine pictures taken a few seconds or minutes apart. This feature uses MediaRecorder to record the images for a time lapse sequence.

To record a time lapse video with MediaRecorder , you must configure the recorder object as if you are recording a normal video, setting the captured frames per second to a low number and using one of the time lapse quality settings, as shown in the code example below.

কোটলিন

mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_HIGH))
mediaRecorder.setCaptureRate(0.1) // capture a frame every 10 seconds

জাভা

// Step 3: Set a CamcorderProfile (requires API Level 8 or higher)
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_TIME_LAPSE_HIGH));
...
// Step 5.5: Set the video capture rate to a low number
mediaRecorder.setCaptureRate(0.1); // capture a frame every 10 seconds

These settings must be done as part of a larger configuration procedure for MediaRecorder . For a full configuration code example, see Configuring MediaRecorder . Once the configuration is complete, you start the video recording as if you were recording a normal video clip. For more information about configuring and running MediaRecorder , see Capturing videos .

The Camera2Video and HdrViewfinder samples further demonstrate the use of the APIs covered on this page.

Camera fields that require permission

Apps running Android 10 (API level 29) or higher must have the CAMERA permission in order to access the values of the following fields that the getCameraCharacteristics() method returns:

  • LENS_POSE_ROTATION
  • LENS_POSE_TRANSLATION
  • LENS_INTRINSIC_CALIBRATION
  • LENS_RADIAL_DISTORTION
  • LENS_POSE_REFERENCE
  • LENS_DISTORTION
  • LENS_INFO_HYPERFOCAL_DISTANCE
  • LENS_INFO_MINIMUM_FOCUS_DISTANCE
  • SENSOR_REFERENCE_ILLUMINANT1
  • SENSOR_REFERENCE_ILLUMINANT2
  • SENSOR_CALIBRATION_TRANSFORM1
  • SENSOR_CALIBRATION_TRANSFORM2
  • SENSOR_COLOR_TRANSFORM1
  • SENSOR_COLOR_TRANSFORM2
  • SENSOR_FORWARD_MATRIX1
  • SENSOR_FORWARD_MATRIX2

Additional sample code

To download sample apps, see the Camera2Basic sample and Official CameraX sample app .