ক্যামেরা API

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

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

নিম্নলিখিত সম্পর্কিত সংস্থান পড়ুন:

বিবেচনা

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

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

বুনিয়াদি

অ্যান্ড্রয়েড ফ্রেমওয়ার্ক android.hardware.camera2 API বা ক্যামেরা 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" />
    
  • সঞ্চয়স্থানের অনুমতি - আপনার অ্যাপ্লিকেশনটি ডিভাইসের বাহ্যিক সঞ্চয়স্থানে (SD কার্ড) ছবি বা ভিডিও সংরক্ষণ করতে পারে যদি এটি Android 10 (API স্তর 29) বা নীচের দিকে লক্ষ্য করে এবং ম্যানিফেস্টে নিম্নলিখিতগুলি নির্দিষ্ট করে৷
    <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;
    }
}

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

Android 2.3 (API লেভেল 9) বা উচ্চতর চলমান ডিভাইসগুলিতে, আপনি 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());
        }
    }
}

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

দ্রষ্টব্য: Android 7.0 (API লেভেল 24) এবং উচ্চতর মাল্টি-উইন্ডো বৈশিষ্ট্যের প্রবর্তনের সাথে, আপনি 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>

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

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

কোটলিন

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 একটি মৌলিক বাস্তবায়ন দেখায়। 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() ) কলগুলি পরিচালনা করতে হবে৷

দ্রষ্টব্য: Android 4.0 (API স্তর 14) দিয়ে শুরু করে, 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() ব্যবহার করে একটি প্রোফাইল উদাহরণ পান। অ্যান্ড্রয়েডের 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.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;
}

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

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

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

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

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

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

সারণি 1. সাধারণ ক্যামেরা বৈশিষ্ট্যগুলি 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 সংরক্ষিত ছবির পিক্সেল মাত্রা নির্দিষ্ট করুন

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

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

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

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

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

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

কোটলিন

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 লেভেল 14) দিয়ে শুরু করে প্রিভিউ রিস্টার্ট না করে প্রিভিউ ওরিয়েন্টেশন পরিবর্তন করা যেতে পারে।

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

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

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

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

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

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

চিত্র 1. লাল রেখাগুলি একটি ক্যামেরা প্রিভিউয়ের মধ্যে একটি 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 ইন্টারফেস প্রয়োগ করে।

কোটলিন

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

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

কোটলিন

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

কোটলিন

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 কনফিগার এবং চালানো সম্পর্কে আরও তথ্যের জন্য, ভিডিওগুলি ক্যাপচারিং দেখুন।

ক্যামেরা 2 ভিডিও এবং এইচডিআরভিফাইন্ডারের নমুনাগুলি এই পৃষ্ঠায় আচ্ছাদিত এপিআইগুলির ব্যবহার আরও প্রদর্শন করে।

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

অ্যান্ড্রয়েড 10 (এপিআই স্তর 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

অতিরিক্ত নমুনা কোড

নমুনা অ্যাপ্লিকেশনগুলি ডাউনলোড করতে, ক্যামেরা 2basic নমুনা এবং অফিসিয়াল ক্যামেরাক্স নমুনা অ্যাপ্লিকেশনটি দেখুন।