Camera API

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

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

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

বিবেচ্য বিষয়

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

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

প্রাথমিক বিষয়

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

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

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

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

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

    <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" />

    ব্যবহারকারীর লোকেশন পাওয়ার ব্যাপারে আরও তথ্য পেতে, লোকেশন স্ট্র্যাটেজি দেখুন।

আগে থেকে থাকা ক্যামেরা অ্যাপ ব্যবহার করা

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

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

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

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

আপনার অ্যাপ্লিকেশনের জন্য কাস্টম ক্যামেরা ইন্টারফেস তৈরি করার সাধারণ ধাপগুলি নিচে দেওয়া হল:

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

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

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

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

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

Kotlin

/** 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;
    }
}

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

ক্যামেরা অ্যাক্সেস করা হচ্ছে

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

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

Kotlin

/** 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() ব্যবহার করার সময় ব্যতিক্রমের জন্য সবসময় চেক করুন। ক্যামেরা ব্যবহার করা হচ্ছে কিনা বা ক্যামেরা না থাকলে, ব্যতিক্রম চেক করতে না পারলে, সিস্টেম আপনার অ্যাপ্লিকেশন বন্ধ করে দেবে।

Android 2.3 (API লেভেল 9) বা তার পরবর্তী যেকোনও ভার্সন রান করছে এমন ডিভাইসে, আপনি Camera.open(int) ব্যবহার করে নির্দিষ্ট ক্যামেরা অ্যাক্সেস করতে পারবেন। উপরের উদাহরণ কোডটি একাধিক ক্যামেরা সহ ডিভাইসে প্রথম, পিছনের দিকের ক্যামেরা অ্যাক্সেস করবে।

ক্যামেরার ফিচার চেক করা

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

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

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

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

Kotlin

/** 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());
        }
    }
}

আপনার ক্যামেরা প্রিভিউয়ের জন্য নির্দিষ্ট সাইজ সেট করতে চাইলে, উপরে কমেন্টে উল্লেখ করা surfaceChanged() পদ্ধতিতে এটি সেট করুন। প্রিভিউ সাইজ সেট করার সময়, আপনাকে getSupportedPreviewSizes() থেকে ভ্যালু ব্যবহার করতেই হবে। setPreviewSize() পদ্ধতিতে ইচ্ছামতো ভ্যালু সেট করবেন না।

মনে রাখবেন: Android 7.0 (API লেভেল ২৪) এবং তার পরবর্তী ভার্সনে মাল্টি-উইন্ডো ফিচার চালু হওয়ার পর থেকে, 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>

মনে রাখবেন: ক্যামেরা প্রিভিউ ল্যান্ডস্কেপ মোডে থাকতে হবে না। Android 2.2 (API লেভেল 8) থেকে শুরু করে, আপনি প্রিভিউ ছবির রোটেশন সেট করতে setDisplayOrientation() পদ্ধতি ব্যবহার করতে পারেন। ব্যবহারকারী ফোনটি আবার ওরিয়েন্ট করার সাথে সাথে প্রিভিউ ওরিয়েন্টেশন পরিবর্তন করতে, আপনার প্রিভিউ ক্লাসের surfaceChanged() পদ্ধতির মধ্যে, প্রথমে Camera.stopPreview()-এর মাধ্যমে প্রিভিউ বন্ধ করুন, ওরিয়েন্টেশন পরিবর্তন করুন এবং তারপরে Camera.startPreview()-এর মাধ্যমে আবার প্রিভিউ শুরু করুন।

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

Kotlin

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() পদ্ধতিটি ক্যামেরা অ্যাক্সেস করা-তে দেখানো উদাহরণ পদ্ধতিকে বোঝায়।

ছবি ক্যাপচার করা হচ্ছে

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

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

Kotlin

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 থেকে এই পদ্ধতি কল করতে হয়।

Kotlin

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 অবজেক্ট ব্যবহার করা শেষ করলে Camera.release() কল করে সেটি রিলিজ করতে ভুলবেন না! ক্যামেরা কীভাবে রিলিজ করবেন সেই ব্যাপারে তথ্যের জন্য, ক্যামেরা রিলিজ করা দেখুন।

ভিডিও ক্যাপচার করা

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

মনে রাখবেন: Android 4.0 (API লেভেল ১৪) থেকে শুরু করে, Camera.lock() এবং Camera.unlock() কল আপনার জন্য অটোমেটিক ম্যানেজ করা হয়।

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

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

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

    3. MediaRecorder প্রস্তুত করুন - MediaRecorder.prepare()-এ কল করে প্রদত্ত কনফিগারেশন সেটিংসের মাধ্যমে MediaRecorder প্রস্তুত করুন।
    4. MediaRecorder চালু করুন - MediaRecorder.start()-এ কল করে ভিডিও রেকর্ডিং শুরু করুন।
  5. ভিডিও রেকর্ডিং বন্ধ করা - ভিডিও রেকর্ডিং সফলভাবে সম্পূর্ণ করতে, ক্রম অনুযায়ী নিম্নলিখিত পদ্ধতিগুলি কল করুন:
    1. MediaRecorder বন্ধ করুন - MediaRecorder.stop() কল করে ভিডিও রেকর্ডিং বন্ধ করুন।
    2. MediaRecorder রিসেট করুন - বিকল্প হিসেবে, MediaRecorder.reset()-এ কল করে রেকর্ডার থেকে কনফিগারেশন সেটিংস সরিয়ে দিন।
    3. MediaRecorder রিলিজ করুন - 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 ক্লাস ব্যবহার করার সময়, আপনাকে অবশ্যই নির্দিষ্ট ক্রমে কনফিগারেশন ধাপগুলি সম্পূর্ণ করতে হবে এবং তারপর কনফিগারেশন চেক ও প্রয়োগ করার জন্য MediaRecorder.prepare() মেথড কল করতে হবে। ভিডিও রেকর্ডিংয়ের জন্য কীভাবে MediaRecorder ক্লাস সঠিকভাবে কনফিগার ও প্রস্তুত করতে হয় তা নিম্নলিখিত উদাহরণ কোড থেকে দেখানো হয়েছে।

Kotlin

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;
}

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

Kotlin

    // 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 ক্লাস ব্যবহার করে ভিডিও রেকর্ডিং সঠিকভাবে শুরু এবং বন্ধ করার জন্য একটি বোতাম ওয়্যার আপ করতে হয়।

মনে রাখবেন: ভিডিও রেকর্ডিং সম্পূর্ণ করার সময়, ক্যামেরা রিলিজ করবেন না অথবা আপনার প্রিভিউ বন্ধ হয়ে যাবে।

Kotlin

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() পদ্ধতিটি MediaRecorder কনফিগার করা-তে দেখানো উদাহরণ কোডকে বোঝায়। এই পদ্ধতি ক্যামেরা লক করা, কনফিগার করা এবং MediaRecorder ইনস্ট্যান্স প্রস্তুত করার কাজ করে।

ক্যামেরা রিলিজ করা হচ্ছে

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

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

Kotlin

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;
        }
    }
}

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

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

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

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

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

Kotlin

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() Android 2.2 (API লেভেল 8) বা তার পরবর্তী ভার্সনে উপলভ্য। আপনি যদি Android-এর পুরনো ভার্সন সহ ডিভাইস টার্গেট করেন, তাহলে এর পরিবর্তে Environment.getExternalStorageDirectory() ব্যবহার করুন। আরও তথ্যের জন্য, শেয়ার করা ফাইল সেভ করা দেখুন।

URI-কে অফিস প্রোফাইলে কাজ করার উপযুক্ত করতে, প্রথমে ফাইলের URI-কে কন্টেন্টের URI-তে পরিবর্তন করুন। তারপর, Intent-এর EXTRA_OUTPUT -এ কন্টেন্ট URI যোগ করুন।

Android ডিভাইসে ফাইল সেভ করার ব্যাপারে আরও তথ্যের জন্য, ডেটা স্টোরেজ দেখুন।

ক্যামেরা ফিচার

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

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

টেবিল ১. ক্যামেরার সাধারণ ফিচারগুলি Android API লেভেল অনুযায়ী সাজানো হয়েছে, যে লেভেলে সেগুলি প্রথমবার চালু করা হয়েছিল।

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

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

ফিচার উপলভ্য কিনা চেক করে দেখা হচ্ছে

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

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

Kotlin

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 আপনার অ্যাপ্লিকেশনকে এমন ডিভাইসে ইনস্টল করা থেকে সীমাবদ্ধ করে যা এই ফিচারগুলিকে সমর্থন করে না। আপনার অ্যাপ ম্যানিফেস্টে ঘোষণা করা যেতে পারে এমন ক্যামেরা ফিচারের তালিকা দেখতে, ম্যানিফেস্ট ফিচার রেফারেন্স দেখুন।

ক্যামেরা ফিচার ব্যবহার করা

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

Kotlin

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 অবজেক্টের ইনস্ট্যান্স পাওয়ার পরে বেশিরভাগ প্যারামিটার যেকোনও সময় পরিবর্তন করা যায়। প্যারামিটারে করা পরিবর্তনগুলি সাধারণত অ্যাপ্লিকেশনের ক্যামেরা প্রিভিউতে ব্যবহারকারীর কাছে অবিলম্বে দৃশ্যমান হয়। সফ্টওয়্যারের ক্ষেত্রে, প্যারামিটার পরিবর্তনগুলি কার্যকর হতে বেশ কয়েকটি ফ্রেম লাগতে পারে কারণ ক্যামেরা হার্ডওয়্যার নতুন নির্দেশাবলী প্রসেস করে এবং তারপরে আপডেট করা ছবি ডেটা পাঠায়।

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

অন্যান্য ক্যামেরা ফিচার প্রয়োগ করার জন্য আরও কোডের প্রয়োজন, যার মধ্যে এগুলি অন্তর্ভুক্ত:

  • মিটারিং ও ফোকাস এরিয়া
  • ফেস ডিটেকশন
  • টাইম ল্যাপ্স ভিডিও

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

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

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

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

Kotlin

// 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 ফিল্ডে ২০০০ x ২০০০ ইউনিট গ্রিডে ম্যাপ করা একটি আয়তাকার আকৃতির বর্ণনা দেওয়া হয়েছে। -১০০০, -১০০০ কোঅর্ডিনেট ক্যামেরা ইমেজের উপরের, বাঁদিকের কোণকে বোঝায় এবং ১০০০, ১০০০ কোঅর্ডিনেট ক্যামেরা ইমেজের নিচের, ডানদিকের কোণকে বোঝায়, যেমনটি নিচের ছবিতে দেখানো হয়েছে।

ছবি ১. ক্যামেরা প্রিভিউতে Camera.Area নির্দিষ্ট করার জন্য লাল লাইনগুলি কোঅর্ডিনেট সিস্টেমকে ব্যাখ্যা করে। নীল বক্সটি Rect ভ্যালু 333,333,667,667 সহ ক্যামেরা এরিয়ার লোকেশন ও আকৃতি দেখায়।

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

ফেস ডিটেকশন

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

মনে রাখবেন: ফেস ডিটেকশন ফিচার চালু থাকাকালীন, setWhiteBalance(String), setFocusAreas(List<Camera.Area>) এবং setMeteringAreas(List<Camera.Area>)-এর কোনও প্রভাব থাকে না।

আপনার ক্যামেরা অ্যাপ্লিকেশনে ফেস ডিটেকশন ফিচার ব্যবহার করার জন্য কয়েকটি সাধারণ ধাপ প্রয়োজন:

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

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

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

Kotlin

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 অবজেক্টে সেট করেন, যেমনটি নিচের উদাহরণ কোডে দেখানো হয়েছে:

Kotlin

camera?.setFaceDetectionListener(MyFaceDetectionListener())

জাভা

camera.setFaceDetectionListener(new MyFaceDetectionListener());

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

Kotlin

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();
    }
}

ক্যামেরা প্রিভিউ শুরু (বা রিস্টার্ট) করার প্রতিবার আপনাকে ফেস ডিটেকশন শুরু করতে হবে। আপনি যদি প্রিভিউ ক্লাস তৈরি করা-তে দেখানো প্রিভিউ ক্লাস ব্যবহার করেন, তাহলে আপনার startFaceDetection() পদ্ধতিটি আপনার প্রিভিউ ক্লাসের surfaceCreated() এবং surfaceChanged() উভয় পদ্ধতিতে যোগ করুন, যেমনটি নিচের স্যাম্পেল কোডে দেখানো হয়েছে।

Kotlin

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());
    }
}

মনে রাখবেন: startPreview() কল করার পরে এই পদ্ধতি কল করতে ভুলবেন না। আপনার ক্যামেরা অ্যাপের মূল অ্যাক্টিভিটির onCreate() পদ্ধতিতে ফেস ডিটেকশন শুরু করার চেষ্টা করবেন না, কারণ আপনার অ্যাপ্লিকেশনের এক্সিকিউশনের এই পয়েন্টে প্রিভিউ উপলভ্য নয়।

টাইম ল্যাপ্স ভিডিও

টাইম ল্যাপ্স ভিডিওর মাধ্যমে ব্যবহারকারীরা এমন ভিডিও ক্লিপ তৈরি করতে পারেন যা কয়েক সেকেন্ড বা মিনিট অন্তর তোলা ছবিকে একত্রিত করে। এই ফিচার টাইম ল্যাপ্স সিকোয়েন্সের জন্য ছবি রেকর্ড করতে MediaRecorder ব্যবহার করে।

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

Kotlin

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

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

Camera2Video এবং HdrViewfinder স্যাম্পেল এই পৃষ্ঠায় কভার করা API-এর ব্যবহার আরও ভালভাবে দেখায়।

ক্যামেরার ফিল্ড যেগুলির জন্য অনুমতি প্রয়োজন

Android 10 (API লেভেল 29) বা তার পরবর্তী যেকোনও ভার্সনে চলা অ্যাপে CAMERA অনুমতি থাকতে হবে যাতে নিম্নলিখিত ফিল্ডের ভ্যালু অ্যাক্সেস করা যায়, যা getCameraCharacteristics() পদ্ধতি ফিরিয়ে দেয়:

  • 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

অতিরিক্ত স্যাম্পেল কোড

স্যাম্পেল অ্যাপ ডাউনলোড করতে, Camera2Basic স্যাম্পেল এবং অফিসিয়াল CameraX স্যাম্পেল অ্যাপ দেখুন।