ক্যামেরা 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.open() এবং Camera.release() কলগুলি ছাড়াও, ক্যামেরা হার্ডওয়্যারে MediaRecorder অ্যাক্সেসের অনুমতি দেওয়ার জন্য আপনাকে অবশ্যই Camera.lock() এবং Camera.unlock() কলগুলি পরিচালনা করতে হবে৷

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

Camera.Area Rect ফিল্ড। এরিয়া অবজেক্ট একটি 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 নমুনা এবং অফিসিয়াল ক্যামেরাক্স নমুনা অ্যাপ্লিকেশনটি দেখুন।

,

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

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

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

বিবেচনা

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

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

বুনিয়াদি

অ্যান্ড্রয়েড ফ্রেমওয়ার্কটি android.hardware.camera2 2 এপিআই বা ক্যামেরার Intent মাধ্যমে চিত্র এবং ভিডিও ক্যাপচারকে সমর্থন করে। এখানে প্রাসঙ্গিক ক্লাস রয়েছে:

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

প্রকাশ্য ঘোষণা

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

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

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

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

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

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

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

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

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

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

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

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

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

দ্রষ্টব্য: নিম্নলিখিত গাইডটি পুরানো, অবমূল্যায়িত Camera এপিআইয়ের জন্য। নতুন বা উন্নত ক্যামেরা অ্যাপ্লিকেশনগুলির জন্য, নতুন android.hardware.camera2 এপিআই প্রস্তাবিত।

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

  • ক্যামেরা সনাক্ত করুন এবং অ্যাক্সেস করুন - ক্যামেরাগুলির অস্তিত্ব পরীক্ষা করার জন্য কোড তৈরি করুন এবং অ্যাক্সেসের জন্য অনুরোধ করুন।
  • একটি পূর্বরূপ শ্রেণি তৈরি করুন - একটি ক্যামেরা পূর্বরূপ শ্রেণি তৈরি করুন যা 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;
    }
}

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

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

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

একবার আপনি কোনও ক্যামেরায় অ্যাক্সেস পেয়ে গেলে, আপনি Camera.getParameters() ব্যবহার করে এর ক্ষমতা সম্পর্কে আরও তথ্য পেতে পারেন Camera.Parameters এপিআই স্তর 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() পদ্ধতিতে স্বেচ্ছাসেবী মানগুলি সেট করবেন না

দ্রষ্টব্য: অ্যান্ড্রয়েড 7.0 (এপিআই স্তর 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 (এপিআই স্তর 8) থেকে শুরু করে, আপনি পূর্বরূপ চিত্রের ঘূর্ণন সেট করতে setDisplayOrientation() পদ্ধতিটি ব্যবহার করতে পারেন। আপনার পূর্বরূপ শ্রেণীর surfaceChanged() পদ্ধতির মধ্যে ব্যবহারকারী ফোনটি পুনরায় ওরিয়েন্ট হিসাবে পূর্বরূপ ওরিয়েন্টেশন পরিবর্তন করার জন্য প্রথমে Camera.stopPreview() ওরিয়েন্টেশনটি পরিবর্তন করুন এবং তারপরে 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() পদ্ধতি। এই পদ্ধতিটি তিনটি পরামিতি নেয় যা ক্যামেরা থেকে ডেটা গ্রহণ করে। একটি জেপিজি ফর্ম্যাটে ডেটা পাওয়ার জন্য, চিত্রের ডেটা পেতে এবং এটি একটি ফাইলে লিখতে আপনাকে অবশ্যই একটি Camera.PictureCallback । নিম্নলিখিত কোডটি ক্যামেরা থেকে প্রাপ্ত কোনও চিত্র সংরক্ষণ করতে Camera.PictureCallback ইন্টারফেসের একটি প্রাথমিক বাস্তবায়ন দেখায়।

কোটলিন

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

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

জাভা

private PictureCallback mPicture = new PictureCallback() {

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

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

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

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

কোটলিন

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.lock() এবং Camera.unlock() কল করতে হবে ক্যামেরা হার্ডওয়্যারটিতে MediaRecorder অ্যাক্সেসের অনুমতি দেওয়ার জন্য, Camera.open() এবং Camera.release() কলগুলি ছাড়াও।

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

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

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

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

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

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

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

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

ভিডিও রেকর্ড করতে 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;
}

অ্যান্ড্রয়েড ২.২ (এপিআই স্তর 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 ক্লাসটি ব্যবহার করে ভিডিও রেকর্ডিং শুরু এবং বন্ধ করার সময়, আপনাকে অবশ্যই নীচে তালিকাভুক্ত হিসাবে একটি নির্দিষ্ট অর্ডার অনুসরণ করতে হবে।

  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 উদাহরণটি প্রস্তুত করার যত্ন নেয়।

ক্যামেরা প্রকাশ

ক্যামেরাগুলি এমন একটি সংস্থান যা কোনও ডিভাইসে অ্যাপ্লিকেশন দ্বারা ভাগ করা হয়। আপনার অ্যাপ্লিকেশনটি 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;
        }
    }
}

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

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

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

  • Environment.getExternalStoragePublicDirectory প্রজাতন্ত্রের ডাইরেক্টরি ( Environment.DIRECTORY_PICTURES ) - এই পদ্ধতিটি ছবি এবং ভিডিও সংরক্ষণের জন্য স্ট্যান্ডার্ড, ভাগ করা এবং প্রস্তাবিত অবস্থানটি প্রদান করে। এই ডিরেক্টরিটি ভাগ করা হয়েছে (সর্বজনীন), তাই অন্যান্য অ্যাপ্লিকেশনগুলি সহজেই এই স্থানে সংরক্ষিত ফাইলগুলি আবিষ্কার, পড়তে, পরিবর্তন করতে এবং মুছতে পারে। যদি আপনার অ্যাপ্লিকেশনটি ব্যবহারকারী দ্বারা আনইনস্টল করা হয় তবে এই স্থানে সংরক্ষিত মিডিয়া ফাইলগুলি সরানো হবে না। ব্যবহারকারীদের বিদ্যমান ছবি এবং ভিডিওগুলিতে হস্তক্ষেপ এড়াতে, আপনার এই ডিরেক্টরিতে আপনার অ্যাপ্লিকেশনটির মিডিয়া ফাইলগুলির জন্য একটি সাব-ডিরেক্টরি তৈরি করা উচিত, যেমন নীচের কোড নমুনায় দেখানো হয়েছে। এই পদ্ধতিটি অ্যান্ড্রয়েড 2.2 (এপিআই স্তর 8) এ উপলব্ধ, পূর্ববর্তী এপিআই সংস্করণগুলিতে সমতুল্য কলগুলির জন্য, ভাগ করা ফাইলগুলি সংরক্ষণ করুন।
  • 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() অ্যান্ড্রয়েড ২.২ (এপিআই স্তর 8) বা তারও বেশি পাওয়া যায়। আপনি যদি অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলির সাথে ডিভাইসগুলিকে টার্গেট করছেন তবে Environment.getExternalStorageDirectory() ব্যবহার করুন exter আরও তথ্যের জন্য, ভাগ করা ফাইলগুলি সংরক্ষণ করা দেখুন।

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

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

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

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

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

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

বৈশিষ্ট্য 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 একটি জেপিইজি চিত্রের জন্য সংকোচনের স্তরটি সেট করুন, যা চিত্রের আউটপুট ফাইলের গুণমান এবং আকার বাড়ায় বা হ্রাস করে
Flash Mode 5 ফ্ল্যাশ চালু, বন্ধ, বা স্বয়ংক্রিয় সেটিং ব্যবহার করুন
Color Effects 5 কালো এবং সাদা, সেপিয়া টোন বা নেতিবাচক মতো ক্যাপচার করা চিত্রটিতে রঙিন প্রভাব প্রয়োগ করুন।
Anti-Banding 5 জেপিইজি সংক্ষেপণের কারণে রঙিন গ্রেডিয়েন্টগুলিতে ব্যান্ডিংয়ের প্রভাব হ্রাস করে
Picture Format 1 ছবির জন্য ফাইল ফর্ম্যাট নির্দিষ্ট করুন
Picture Size 1 সংরক্ষিত ছবির পিক্সেল মাত্রা নির্দিষ্ট করুন

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

কোনও মুখ সনাক্তকরণের বিষয়ে অবহিত এবং প্রতিক্রিয়া জানাতে, আপনার ক্যামেরা অ্যাপ্লিকেশনটি অবশ্যই মুখ সনাক্তকরণ ইভেন্টগুলির জন্য শ্রোতা সেট করতে হবে। In order to do this, you must create a listener class that implements the Camera.FaceDetectionListener interface as shown in the example code below.

কোটলিন

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

After creating this class, you then set it into your application's Camera object, as shown in the example code below:

কোটলিন

camera?.setFaceDetectionListener(MyFaceDetectionListener())

জাভা

camera.setFaceDetectionListener(new MyFaceDetectionListener());

Your application must start the face detection function each time you start (or restart) the camera preview. Create a method for starting face detection so you can call it as needed, as shown in the example code below.

কোটলিন

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

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

জাভা

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

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

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

কোটলিন

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

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

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

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

জাভা

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

        startFaceDetection(); // start face detection feature

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

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

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

    try {
        mCamera.stopPreview();

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

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

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

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

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

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

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

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

কোটলিন

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

জাভা

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

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

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

Camera fields that require permission

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

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

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

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

,

The Android framework includes support for various cameras and camera features available on devices, allowing you to capture pictures and videos in your applications. This document discusses a quick, simple approach to image and video capture and outlines an advanced approach for creating custom camera experiences for your users.

Note: This page describes the Camera class, which has been deprecated. We recommend using the CameraX Jetpack library or, for specific use cases, the camera2 , class. Both CameraX and Camera2 work on Android 5.0 (API level 21) and higher.

বিবেচনা

Before enabling your application to use cameras on Android devices, you should consider a few questions about how your app intends to use this hardware feature.

  • Camera Requirement - Is the use of a camera so important to your application that you do not want your application installed on a device that does not have a camera? If so, you should declare the camera requirement in your manifest .
  • Quick Picture or Customized Camera - How will your application use the camera? Are you just interested in snapping a quick picture or video clip, or will your application provide a new way to use cameras? For getting a quick snap or clip, consider Using Existing Camera Apps . For developing a customized camera feature, check out the Building a Camera App section.
  • Foreground Services Requirement - When does your app interact with the camera? On Android 9 (API level 28) and later, apps running in the background cannot access the camera. Therefore, you should use the camera either when your app is in the foreground or as part of a foreground service .
  • Storage - Are the images or videos your application generates intended to be only visible to your application or shared so that other applications such as Gallery or other media and social apps can use them? Do you want the pictures and videos to be available even if your application is uninstalled? Check out the Saving Media Files section to see how to implement these options.

বুনিয়াদি

The Android framework supports capturing images and video through the android.hardware.camera2 API or camera Intent . Here are the relevant classes:

android.hardware.camera2
This package is the primary API for controlling device cameras. It can be used to take pictures or videos when you are building a camera application.
Camera
This class is the older deprecated API for controlling device cameras.
SurfaceView
This class is used to present a live camera preview to the user.
MediaRecorder
This class is used to record video from the camera.
Intent
An intent action type of MediaStore.ACTION_IMAGE_CAPTURE or MediaStore.ACTION_VIDEO_CAPTURE can be used to capture images or videos without directly using the Camera object.

Manifest declarations

Before starting development on your application with the Camera API, you should make sure your manifest has the appropriate declarations to allow use of camera hardware and other related features.

  • Camera Permission - Your application must request permission to use a device camera.
    <uses-permission android:name="android.permission.CAMERA" />
    

    Note: If you are using the camera by invoking an existing camera app , your application does not need to request this permission.

  • Camera Features - Your application must also declare use of camera features, for example:
    <uses-feature android:name="android.hardware.camera" />
    

    For a list of camera features, see the manifest Features Reference .

    Adding camera features to your manifest causes Google Play to prevent your application from being installed to devices that do not include a camera or do not support the camera features you specify. For more information about using feature-based filtering with Google Play, see Google Play and Feature-Based Filtering .

    If your application can use a camera or camera feature for proper operation, but does not require it, you should specify this in the manifest by including the android:required attribute, and setting it to false :

    <uses-feature android:name="android.hardware.camera" android:required="false" />
    
  • Storage Permission - Your application can save images or videos to the device's external storage (SD Card) if it targets Android 10 (API level 29) or lower and specifies the following in the manifest.
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  • Audio Recording Permission - For recording audio with video capture, your application must request the audio capture permission.
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  • Location Permission - If your application tags images with GPS location information, you must request the ACCESS_FINE_LOCATION permission. Note that, if your app targets Android 5.0 (API level 21) or higher, you also need to declare that your app uses the device's 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" />
    

    For more information about getting user location, see Location Strategies .

Using existing camera apps

A quick way to enable taking pictures or videos in your application without a lot of extra code is to use an Intent to invoke an existing Android camera application. The details are described in the training lessons Taking Photos Simply and Recording Videos Simply .

Building a camera app

Some developers may require a camera user interface that is customized to the look of their application or provides special features. Writing your own picture-taking code can provide a more compelling experience for your users.

Note: The following guide is for the older, deprecated Camera API. For new or advanced camera applications, the newer android.hardware.camera2 API is recommended.

The general steps for creating a custom camera interface for your application are as follows:

  • Detect and Access Camera - Create code to check for the existence of cameras and request access.
  • Create a Preview Class - Create a camera preview class that extends SurfaceView and implements the SurfaceHolder interface. This class previews the live images from the camera.
  • Build a Preview Layout - Once you have the camera preview class, create a view layout that incorporates the preview and the user interface controls you want.
  • Setup Listeners for Capture - Connect listeners for your interface controls to start image or video capture in response to user actions, such as pressing a button.
  • Capture and Save Files - Setup the code for capturing pictures or videos and saving the output.
  • Release the Camera - After using the camera, your application must properly release it for use by other applications.

Camera hardware is a shared resource that must be carefully managed so your application does not collide with other applications that may also want to use it. The following sections discusses how to detect camera hardware, how to request access to a camera, how to capture pictures or video and how to release the camera when your application is done using it.

Caution: Remember to release the Camera object by calling the Camera.release() when your application is done using it! If your application does not properly release the camera, all subsequent attempts to access the camera, including those by your own application, will fail and may cause your or other applications to be shut down.

Detecting camera hardware

If your application does not specifically require a camera using a manifest declaration, you should check to see if a camera is available at runtime. To perform this check, use the PackageManager.hasSystemFeature() method, as shown in the example code below:

কোটলিন

/** 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 devices can have multiple cameras, for example a back-facing camera for photography and a front-facing camera for video calls. Android 2.3 (API Level 9) and later allows you to check the number of cameras available on a device using the Camera.getNumberOfCameras() method.

Accessing cameras

If you have determined that the device on which your application is running has a camera, you must request to access it by getting an instance of Camera (unless you are using an intent to access the camera ).

To access the primary camera, use the Camera.open() method and be sure to catch any exceptions, as shown in the code below:

কোটলিন

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

Caution: Always check for exceptions when using Camera.open() . Failing to check for exceptions if the camera is in use or does not exist will cause your application to be shut down by the system.

On devices running Android 2.3 (API Level 9) or higher, you can access specific cameras using Camera.open(int) . The example code above will access the first, back-facing camera on a device with more than one camera.

Checking camera features

Once you obtain access to a camera, you can get further information about its capabilities using the Camera.getParameters() method and checking the returned Camera.Parameters object for supported capabilities. When using API Level 9 or higher, use the Camera.getCameraInfo() to determine if a camera is on the front or back of the device, and the orientation of the image.

Creating a preview class

For users to effectively take pictures or video, they must be able to see what the device camera sees. A camera preview class is a SurfaceView that can display the live image data coming from a camera, so users can frame and capture a picture or video.

The following example code demonstrates how to create a basic camera preview class that can be included in a View layout. This class implements SurfaceHolder.Callback in order to capture the callback events for creating and destroying the view, which are needed for assigning the camera preview input.

কোটলিন

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

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

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

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

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

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

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

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

জাভা

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

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

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

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

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

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

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

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

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

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

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

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

Note: With the introduction of the Multi-Window feature in Android 7.0 (API level 24) and higher, you can no longer assume the aspect ratio of the preview is the same as your activity even after calling setDisplayOrientation() . Depending on the window size and aspect ratio, you may may have to fit a wide camera preview into a portrait-orientated layout, or vice versa, using a letterbox layout.

Placing preview in a layout

A camera preview class, such as the example shown in the previous section, must be placed in the layout of an activity along with other user interface controls for taking a picture or video. This section shows you how to build a basic layout and activity for the preview.

The following layout code provides a very basic view that can be used to display a camera preview. In this example, the FrameLayout element is meant to be the container for the camera preview class. This layout type is used so that additional picture information or controls can be overlaid on the live camera preview images.

<?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>

On most devices, the default orientation of the camera preview is landscape. This example layout specifies a horizontal (landscape) layout and the code below fixes the orientation of the application to landscape. For simplicity in rendering a camera preview, you should change your application's preview activity orientation to landscape by adding the following to your manifest.

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

Note: A camera preview does not have to be in landscape mode. Starting in Android 2.2 (API Level 8), you can use the setDisplayOrientation() method to set the rotation of the preview image. In order to change preview orientation as the user re-orients the phone, within the surfaceChanged() method of your preview class, first stop the preview with Camera.stopPreview() change the orientation and then start the preview again with Camera.startPreview()

In the activity for your camera view, add your preview class to the FrameLayout element shown in the example above. Your camera activity must also ensure that it releases the camera when it is paused or shut down. The following example shows how to modify a camera activity to attach the preview class shown in Creating a preview class .

কোটলিন

class CameraActivity : Activity() {

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

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

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

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

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

জাভা

public class CameraActivity extends Activity {

    private Camera mCamera;
    private CameraPreview mPreview;

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

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

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

Note: The getCameraInstance() method in the example above refers to the example method shown in Accessing cameras .

Capturing pictures

Once you have built a preview class and a view layout in which to display it, you are ready to start capturing images with your application. In your application code, you must set up listeners for your user interface controls to respond to a user action by taking a picture.

In order to retrieve a picture, use the Camera.takePicture() method. This method takes three parameters which receive data from the camera. In order to receive data in a JPEG format, you must implement an Camera.PictureCallback interface to receive the image data and write it to a file. The following code shows a basic implementation of the Camera.PictureCallback interface to save an image received from the camera.

কোটলিন

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

Trigger capturing an image by calling the Camera.takePicture() method. The following example code shows how to call this method from a button 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);
        }
    }
);

Note: The mPicture member in the following example refers to the example code above.

Caution: Remember to release the Camera object by calling the Camera.release() when your application is done using it! For information about how to release the camera, see Releasing the camera .

Capturing videos

Video capture using the Android framework requires careful management of the Camera object and coordination with the MediaRecorder class. When recording video with Camera , you must manage the Camera.lock() and Camera.unlock() calls to allow MediaRecorder access to the camera hardware, in addition to the Camera.open() and Camera.release() calls.

Note: Starting with Android 4.0 (API level 14), the Camera.lock() and Camera.unlock() calls are managed for you automatically.

Unlike taking pictures with a device camera, capturing video requires a very particular call order. You must follow a specific order of execution to successfully prepare for and capture video with your application, as detailed below.

  1. Open Camera - Use the Camera.open() to get an instance of the camera object.
  2. Connect Preview - Prepare a live camera image preview by connecting a SurfaceView to the camera using Camera.setPreviewDisplay() .
  3. Start Preview - Call Camera.startPreview() to begin displaying the live camera images.
  4. Start Recording Video - The following steps must be completed in order to successfully record video:
    1. Unlock the Camera - Unlock the camera for use by MediaRecorder by calling Camera.unlock() .
    2. Configure MediaRecorder - Call in the following MediaRecorder methods in this order . For more information, see the MediaRecorder reference documentation.
      1. setCamera() - Set the camera to be used for video capture, use your application's current instance of Camera .
      2. setAudioSource() - Set the audio source, use MediaRecorder.AudioSource.CAMCORDER .
      3. setVideoSource() - Set the video source, use MediaRecorder.VideoSource.CAMERA .
      4. Set the video output format and encoding. For Android 2.2 (API Level 8) and higher, use the MediaRecorder.setProfile method, and get a profile instance using CamcorderProfile.get() . For versions of Android prior to 2.2, you must set the video output format and encoding parameters:
        1. setOutputFormat() - Set the output format, specify the default setting or MediaRecorder.OutputFormat.MPEG_4 .
        2. setAudioEncoder() - Set the sound encoding type, specify the default setting or MediaRecorder.AudioEncoder.AMR_NB .
        3. setVideoEncoder() - Set the video encoding type, specify the default setting or MediaRecorder.VideoEncoder.MPEG_4_SP .
      5. setOutputFile() - Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() from the example method in the Saving Media Files section.
      6. setPreviewDisplay() - Specify the SurfaceView preview layout element for your application. Use the same object you specified for Connect Preview .

      Caution: You must call these MediaRecorder configuration methods in this order , otherwise your application will encounter errors and the recording will fail.

    3. Prepare MediaRecorder - Prepare the MediaRecorder with provided configuration settings by calling MediaRecorder.prepare() .
    4. Start MediaRecorder - Start recording video by calling MediaRecorder.start() .
  5. Stop Recording Video - Call the following methods in order , to successfully complete a video recording:
    1. Stop MediaRecorder - Stop recording video by calling MediaRecorder.stop() .
    2. Reset MediaRecorder - Optionally, remove the configuration settings from the recorder by calling MediaRecorder.reset() .
    3. Release MediaRecorder - Release the MediaRecorder by calling MediaRecorder.release() .
    4. Lock the Camera - Lock the camera so that future MediaRecorder sessions can use it by calling Camera.lock() . Starting with Android 4.0 (API level 14), this call is not required unless the MediaRecorder.prepare() call fails.
  6. Stop the Preview - When your activity has finished using the camera, stop the preview using Camera.stopPreview() .
  7. Release Camera - Release the camera so that other applications can use it by calling Camera.release() .

Note: It is possible to use MediaRecorder without creating a camera preview first and skip the first few steps of this process. However, since users typically prefer to see a preview before starting a recording, that process is not discussed here.

Tip: If your application is typically used for recording video, set setRecordingHint(boolean) to true prior to starting your preview. This setting can help reduce the time it takes to start recording.

Configuring MediaRecorder

When using the MediaRecorder class to record video, you must perform configuration steps in a specific order and then call the MediaRecorder.prepare() method to check and implement the configuration. The following example code demonstrates how to properly configure and prepare the MediaRecorder class for video recording.

কোটলিন

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

Prior to Android 2.2 (API Level 8), you must set the output format and encoding formats parameters directly, instead of using CamcorderProfile . This approach is demonstrated in the following code:

কোটলিন

    // 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);

The following video recording parameters for MediaRecorder are given default settings, however, you may want to adjust these settings for your application:

Starting and stopping MediaRecorder

When starting and stopping video recording using the MediaRecorder class, you must follow a specific order, as listed below.

  1. Unlock the camera with Camera.unlock()
  2. Configure MediaRecorder as shown in the code example above
  3. Start recording using MediaRecorder.start()
  4. ভিডিও রেকর্ড করুন
  5. Stop recording using MediaRecorder.stop()
  6. Release the media recorder with MediaRecorder.release()
  7. Lock the camera using Camera.lock()

The following example code demonstrates how to wire up a button to properly start and stop video recording using the camera and the MediaRecorder class.

Note: When completing a video recording, do not release the camera or else your preview will be stopped.

কোটলিন

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

Note: In the above example, the prepareVideoRecorder() method refers to the example code shown in Configuring MediaRecorder . This method takes care of locking the camera, configuring and preparing the MediaRecorder instance.

Releasing the camera

Cameras are a resource that is shared by applications on a device. Your application can make use of the camera after getting an instance of Camera , and you must be particularly careful to release the camera object when your application stops using it, and as soon as your application is paused ( Activity.onPause() ). If your application does not properly release the camera, all subsequent attempts to access the camera, including those by your own application, will fail and may cause your or other applications to be shut down.

To release an instance of the Camera object, use the Camera.release() method, as shown in the example code below.

কোটলিন

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

Caution: If your application does not properly release the camera, all subsequent attempts to access the camera, including those by your own application, will fail and may cause your or other applications to be shut down.

Saving media files

Media files created by users such as pictures and videos should be saved to a device's external storage directory (SD Card) to conserve system space and to allow users to access these files without their device. There are many possible directory locations to save media files on a device, however there are only two standard locations you should consider as a developer:

  • Environment.getExternalStoragePublicDirectory ( Environment.DIRECTORY_PICTURES ) - This method returns the standard, shared and recommended location for saving pictures and videos. This directory is shared (public), so other applications can easily discover, read, change and delete files saved in this location. If your application is uninstalled by the user, media files saved to this location will not be removed. To avoid interfering with users existing pictures and videos, you should create a sub-directory for your application's media files within this directory, as shown in the code sample below. This method is available in Android 2.2 (API Level 8), for equivalent calls in earlier API versions, see Saving Shared Files .
  • Context.getExternalFilesDir ( Environment.DIRECTORY_PICTURES ) - This method returns a standard location for saving pictures and videos which are associated with your application. If your application is uninstalled, any files saved in this location are removed. Security is not enforced for files in this location and other applications may read, change and delete them.

The following example code demonstrates how to create a File or Uri location for a media file that can be used when invoking a device's camera with an Intent or as part of a Building a Camera App .

কোটলিন

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

Note: Environment.getExternalStoragePublicDirectory() is available in Android 2.2 (API Level 8) or higher. If you are targeting devices with earlier versions of Android, use Environment.getExternalStorageDirectory() instead. For more information, see Saving Shared Files .

To make the URI support work profiles, first convert the file URI to a content URI . Then, add the content URI to EXTRA_OUTPUT of an Intent .

For more information about saving files on an Android device, see Data Storage .

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

Android supports a wide array of camera features you can control with your camera application, such as picture format, flash mode, focus settings, and many more. This section lists the common camera features, and briefly discusses how to use them. Most camera features can be accessed and set using the through Camera.Parameters object. However, there are several important features that require more than simple settings in Camera.Parameters . These features are covered in the following sections:

For general information about how to use features that are controlled through Camera.Parameters , review the Using camera features section. For more detailed information about how to use features controlled through the camera parameters object, follow the links in the feature list below to the API reference documentation.

Table 1. Common camera features sorted by the Android API Level in which they were introduced.

বৈশিষ্ট্য API স্তর বর্ণনা
ফেস ডিটেকশন 14 Identify human faces within a picture and use them for focus, metering and white balance
Metering Areas 14 Specify one or more areas within an image for calculating white balance
ফোকাস এলাকা 14 Set one or more areas within an image to use for focus
White Balance Lock 14 Stop or start automatic white balance adjustments
Exposure Lock 14 Stop or start automatic exposure adjustments
Video Snapshot 14 Take a picture while shooting video (frame grab)
টাইম ল্যাপস ভিডিও 11 Record frames with set delays to record a time lapse video
Multiple Cameras 9 Support for more than one camera on a device, including front-facing and back-facing cameras
Focus Distance 9 Reports distances between the camera and objects that appear to be in focus
Zoom 8 Set image magnification
Exposure Compensation 8 Increase or decrease the light exposure level
GPS Data 5 Include or omit geographic location data with the image
White Balance 5 Set the white balance mode, which affects color values in the captured image
Focus Mode 5 Set how the camera focuses on a subject such as automatic, fixed, macro or infinity
Scene Mode 5 Apply a preset mode for specific types of photography situations such as night, beach, snow or candlelight scenes
JPEG Quality 5 Set the compression level for a JPEG image, which increases or decreases image output file quality and size
Flash Mode 5 Turn flash on, off, or use automatic setting
Color Effects 5 Apply a color effect to the captured image such as black and white, sepia tone or negative.
Anti-Banding 5 Reduces the effect of banding in color gradients due to JPEG compression
Picture Format 1 Specify the file format for the picture
Picture Size 1 Specify the pixel dimensions of the saved picture

Note: These features are not supported on all devices due to hardware differences and software implementation. For information on checking the availability of features on the device where your application is running, see Checking feature availability .

Checking feature availability

The first thing to understand when setting out to use camera features on Android devices is that not all camera features are supported on all devices. In addition, devices that support a particular feature may support them to different levels or with different options. Therefore, part of your decision process as you develop a camera application is to decide what camera features you want to support and to what level. After making that decision, you should plan on including code in your camera application that checks to see if device hardware supports those features and fails gracefully if a feature is not available.

You can check the availability of camera features by getting an instance of a camera's parameters object, and checking the relevant methods. The following code sample shows you how to obtain a Camera.Parameters object and check if the camera supports the autofocus feature:

কোটলিন

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
}

You can use the technique shown above for most camera features. The Camera.Parameters object provides a getSupported...() , is...Supported() or getMax...() method to determine if (and to what extent) a feature is supported.

If your application requires certain camera features in order to function properly, you can require them through additions to your application manifest. When you declare the use of specific camera features, such as flash and auto-focus, Google Play restricts your application from being installed on devices which do not support these features. For a list of camera features that can be declared in your app manifest, see the manifest Features Reference .

Using camera features

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

কোটলিন

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

জাভা

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

This technique works for nearly all camera features, and most parameters can be changed at any time after you have obtained an instance of the Camera object. Changes to parameters are typically visible to the user immediately in the application's camera preview. On the software side, parameter changes may take several frames to actually take effect as the camera hardware processes the new instructions and then sends updated image data.

Important: Some camera features cannot be changed at will. In particular, changing the size or orientation of the camera preview requires that you first stop the preview, change the preview size, and then restart the preview. Starting with Android 4.0 (API Level 14) preview orientation can be changed without restarting the preview.

Other camera features require more code in order to implement, including:

  • Metering and focus areas
  • মুখ সনাক্তকরণ
  • টাইম ল্যাপস ভিডিও

A quick outline of how to implement these features is provided in the following sections.

Metering and focus areas

In some photographic scenarios, automatic focusing and light metering may not produce the desired results. Starting with Android 4.0 (API Level 14), your camera application can provide additional controls to allow your app or users to specify areas in an image to use for determining focus or light level settings and pass these values to the camera hardware for use in capturing images or video.

Areas for metering and focus work very similarly to other camera features, in that you control them through methods in the Camera.Parameters object. The following code demonstrates setting two light metering areas for an instance of Camera :

কোটলিন

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

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

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

জাভা

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

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

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

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

camera.setParameters(params);

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

Camera.Area Rect ফিল্ড। এরিয়া অবজেক্ট একটি 2000 x 2000 ইউনিট গ্রিডে ম্যাপ করা একটি আয়তক্ষেত্রাকার আকৃতি বর্ণনা করে। The coordinates -1000, -1000 represent the top, left corner of the camera image, and coordinates 1000, 1000 represent the bottom, right corner of the camera image, as shown in the illustration below.

Figure 1. The red lines illustrate the coordinate system for specifying a Camera.Area within a camera preview. The blue box shows the location and shape of an camera area with the Rect values 333,333,667,667.

The bounds of this coordinate system always correspond to the outer edge of the image visible in the camera preview and do not shrink or expand with the zoom level. Similarly, rotation of the image preview using Camera.setDisplayOrientation() does not remap the coordinate system.

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

For pictures that include people, faces are usually the most important part of the picture, and should be used for determining both focus and white balance when capturing an image. The Android 4.0 (API Level 14) framework provides APIs for identifying faces and calculating picture settings using face recognition technology.

Note: While the face detection feature is running, setWhiteBalance(String) , setFocusAreas(List<Camera.Area>) and setMeteringAreas(List<Camera.Area>) have no effect.

Using the face detection feature in your camera application requires a few general steps:

  • Check that face detection is supported on the device
  • Create a face detection listener
  • Add the face detection listener to your camera object
  • Start face detection after preview (and after every preview restart)

The face detection feature is not supported on all devices. You can check that this feature is supported by calling getMaxNumDetectedFaces() . An example of this check is shown in the startFaceDetection() sample method below.

In order to be notified and respond to the detection of a face, your camera application must set a listener for face detection events. In order to do this, you must create a listener class that implements the Camera.FaceDetectionListener interface as shown in the example code below.

কোটলিন

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

After creating this class, you then set it into your application's Camera object, as shown in the example code below:

কোটলিন

camera?.setFaceDetectionListener(MyFaceDetectionListener())

জাভা

camera.setFaceDetectionListener(new MyFaceDetectionListener());

Your application must start the face detection function each time you start (or restart) the camera preview. Create a method for starting face detection so you can call it as needed, as shown in the example code below.

কোটলিন

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

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

জাভা

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

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

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

কোটলিন

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

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

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

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

জাভা

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

        startFaceDetection(); // start face detection feature

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

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

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

    try {
        mCamera.stopPreview();

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

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

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

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

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

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

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

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

কোটলিন

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

জাভা

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

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

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

Camera fields that require permission

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

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

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

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

,

The Android framework includes support for various cameras and camera features available on devices, allowing you to capture pictures and videos in your applications. This document discusses a quick, simple approach to image and video capture and outlines an advanced approach for creating custom camera experiences for your users.

Note: This page describes the Camera class, which has been deprecated. We recommend using the CameraX Jetpack library or, for specific use cases, the camera2 , class. Both CameraX and Camera2 work on Android 5.0 (API level 21) and higher.

বিবেচনা

Before enabling your application to use cameras on Android devices, you should consider a few questions about how your app intends to use this hardware feature.

  • Camera Requirement - Is the use of a camera so important to your application that you do not want your application installed on a device that does not have a camera? If so, you should declare the camera requirement in your manifest .
  • Quick Picture or Customized Camera - How will your application use the camera? Are you just interested in snapping a quick picture or video clip, or will your application provide a new way to use cameras? For getting a quick snap or clip, consider Using Existing Camera Apps . For developing a customized camera feature, check out the Building a Camera App section.
  • Foreground Services Requirement - When does your app interact with the camera? On Android 9 (API level 28) and later, apps running in the background cannot access the camera. Therefore, you should use the camera either when your app is in the foreground or as part of a foreground service .
  • Storage - Are the images or videos your application generates intended to be only visible to your application or shared so that other applications such as Gallery or other media and social apps can use them? Do you want the pictures and videos to be available even if your application is uninstalled? Check out the Saving Media Files section to see how to implement these options.

বুনিয়াদি

The Android framework supports capturing images and video through the android.hardware.camera2 API or camera Intent . Here are the relevant classes:

android.hardware.camera2
This package is the primary API for controlling device cameras. It can be used to take pictures or videos when you are building a camera application.
Camera
This class is the older deprecated API for controlling device cameras.
SurfaceView
This class is used to present a live camera preview to the user.
MediaRecorder
This class is used to record video from the camera.
Intent
An intent action type of MediaStore.ACTION_IMAGE_CAPTURE or MediaStore.ACTION_VIDEO_CAPTURE can be used to capture images or videos without directly using the Camera object.

Manifest declarations

Before starting development on your application with the Camera API, you should make sure your manifest has the appropriate declarations to allow use of camera hardware and other related features.

  • Camera Permission - Your application must request permission to use a device camera.
    <uses-permission android:name="android.permission.CAMERA" />
    

    Note: If you are using the camera by invoking an existing camera app , your application does not need to request this permission.

  • Camera Features - Your application must also declare use of camera features, for example:
    <uses-feature android:name="android.hardware.camera" />
    

    For a list of camera features, see the manifest Features Reference .

    Adding camera features to your manifest causes Google Play to prevent your application from being installed to devices that do not include a camera or do not support the camera features you specify. For more information about using feature-based filtering with Google Play, see Google Play and Feature-Based Filtering .

    If your application can use a camera or camera feature for proper operation, but does not require it, you should specify this in the manifest by including the android:required attribute, and setting it to false :

    <uses-feature android:name="android.hardware.camera" android:required="false" />
    
  • Storage Permission - Your application can save images or videos to the device's external storage (SD Card) if it targets Android 10 (API level 29) or lower and specifies the following in the manifest.
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    
  • Audio Recording Permission - For recording audio with video capture, your application must request the audio capture permission.
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    
  • Location Permission - If your application tags images with GPS location information, you must request the ACCESS_FINE_LOCATION permission. Note that, if your app targets Android 5.0 (API level 21) or higher, you also need to declare that your app uses the device's 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" />
    

    For more information about getting user location, see Location Strategies .

Using existing camera apps

A quick way to enable taking pictures or videos in your application without a lot of extra code is to use an Intent to invoke an existing Android camera application. The details are described in the training lessons Taking Photos Simply and Recording Videos Simply .

Building a camera app

Some developers may require a camera user interface that is customized to the look of their application or provides special features. Writing your own picture-taking code can provide a more compelling experience for your users.

Note: The following guide is for the older, deprecated Camera API. For new or advanced camera applications, the newer android.hardware.camera2 API is recommended.

The general steps for creating a custom camera interface for your application are as follows:

  • Detect and Access Camera - Create code to check for the existence of cameras and request access.
  • Create a Preview Class - Create a camera preview class that extends SurfaceView and implements the SurfaceHolder interface. This class previews the live images from the camera.
  • Build a Preview Layout - Once you have the camera preview class, create a view layout that incorporates the preview and the user interface controls you want.
  • Setup Listeners for Capture - Connect listeners for your interface controls to start image or video capture in response to user actions, such as pressing a button.
  • Capture and Save Files - Setup the code for capturing pictures or videos and saving the output.
  • Release the Camera - After using the camera, your application must properly release it for use by other applications.

Camera hardware is a shared resource that must be carefully managed so your application does not collide with other applications that may also want to use it. The following sections discusses how to detect camera hardware, how to request access to a camera, how to capture pictures or video and how to release the camera when your application is done using it.

Caution: Remember to release the Camera object by calling the Camera.release() when your application is done using it! If your application does not properly release the camera, all subsequent attempts to access the camera, including those by your own application, will fail and may cause your or other applications to be shut down.

Detecting camera hardware

If your application does not specifically require a camera using a manifest declaration, you should check to see if a camera is available at runtime. To perform this check, use the PackageManager.hasSystemFeature() method, as shown in the example code below:

কোটলিন

/** 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 devices can have multiple cameras, for example a back-facing camera for photography and a front-facing camera for video calls. Android 2.3 (API Level 9) and later allows you to check the number of cameras available on a device using the Camera.getNumberOfCameras() method.

Accessing cameras

If you have determined that the device on which your application is running has a camera, you must request to access it by getting an instance of Camera (unless you are using an intent to access the camera ).

To access the primary camera, use the Camera.open() method and be sure to catch any exceptions, as shown in the code below:

কোটলিন

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

Caution: Always check for exceptions when using Camera.open() . Failing to check for exceptions if the camera is in use or does not exist will cause your application to be shut down by the system.

On devices running Android 2.3 (API Level 9) or higher, you can access specific cameras using Camera.open(int) . The example code above will access the first, back-facing camera on a device with more than one camera.

Checking camera features

Once you obtain access to a camera, you can get further information about its capabilities using the Camera.getParameters() method and checking the returned Camera.Parameters object for supported capabilities. When using API Level 9 or higher, use the Camera.getCameraInfo() to determine if a camera is on the front or back of the device, and the orientation of the image.

Creating a preview class

For users to effectively take pictures or video, they must be able to see what the device camera sees. A camera preview class is a SurfaceView that can display the live image data coming from a camera, so users can frame and capture a picture or video.

The following example code demonstrates how to create a basic camera preview class that can be included in a View layout. This class implements SurfaceHolder.Callback in order to capture the callback events for creating and destroying the view, which are needed for assigning the camera preview input.

কোটলিন

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

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

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

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

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

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

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

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

জাভা

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

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

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

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

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

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

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

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

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

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

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

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

Note: With the introduction of the Multi-Window feature in Android 7.0 (API level 24) and higher, you can no longer assume the aspect ratio of the preview is the same as your activity even after calling setDisplayOrientation() . Depending on the window size and aspect ratio, you may may have to fit a wide camera preview into a portrait-orientated layout, or vice versa, using a letterbox layout.

Placing preview in a layout

A camera preview class, such as the example shown in the previous section, must be placed in the layout of an activity along with other user interface controls for taking a picture or video. This section shows you how to build a basic layout and activity for the preview.

The following layout code provides a very basic view that can be used to display a camera preview. In this example, the FrameLayout element is meant to be the container for the camera preview class. This layout type is used so that additional picture information or controls can be overlaid on the live camera preview images.

<?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>

On most devices, the default orientation of the camera preview is landscape. This example layout specifies a horizontal (landscape) layout and the code below fixes the orientation of the application to landscape. For simplicity in rendering a camera preview, you should change your application's preview activity orientation to landscape by adding the following to your manifest.

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

Note: A camera preview does not have to be in landscape mode. Starting in Android 2.2 (API Level 8), you can use the setDisplayOrientation() method to set the rotation of the preview image. In order to change preview orientation as the user re-orients the phone, within the surfaceChanged() method of your preview class, first stop the preview with Camera.stopPreview() change the orientation and then start the preview again with Camera.startPreview()

In the activity for your camera view, add your preview class to the FrameLayout element shown in the example above. Your camera activity must also ensure that it releases the camera when it is paused or shut down. The following example shows how to modify a camera activity to attach the preview class shown in Creating a preview class .

কোটলিন

class CameraActivity : Activity() {

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

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

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

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

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

জাভা

public class CameraActivity extends Activity {

    private Camera mCamera;
    private CameraPreview mPreview;

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

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

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

Note: The getCameraInstance() method in the example above refers to the example method shown in Accessing cameras .

Capturing pictures

Once you have built a preview class and a view layout in which to display it, you are ready to start capturing images with your application. In your application code, you must set up listeners for your user interface controls to respond to a user action by taking a picture.

In order to retrieve a picture, use the Camera.takePicture() method. This method takes three parameters which receive data from the camera. In order to receive data in a JPEG format, you must implement an Camera.PictureCallback interface to receive the image data and write it to a file. The following code shows a basic implementation of the Camera.PictureCallback interface to save an image received from the camera.

কোটলিন

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

Trigger capturing an image by calling the Camera.takePicture() method. The following example code shows how to call this method from a button 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);
        }
    }
);

Note: The mPicture member in the following example refers to the example code above.

Caution: Remember to release the Camera object by calling the Camera.release() when your application is done using it! For information about how to release the camera, see Releasing the camera .

Capturing videos

Video capture using the Android framework requires careful management of the Camera object and coordination with the MediaRecorder class. When recording video with Camera , you must manage the Camera.lock() and Camera.unlock() calls to allow MediaRecorder access to the camera hardware, in addition to the Camera.open() and Camera.release() calls.

Note: Starting with Android 4.0 (API level 14), the Camera.lock() and Camera.unlock() calls are managed for you automatically.

Unlike taking pictures with a device camera, capturing video requires a very particular call order. You must follow a specific order of execution to successfully prepare for and capture video with your application, as detailed below.

  1. Open Camera - Use the Camera.open() to get an instance of the camera object.
  2. Connect Preview - Prepare a live camera image preview by connecting a SurfaceView to the camera using Camera.setPreviewDisplay() .
  3. Start Preview - Call Camera.startPreview() to begin displaying the live camera images.
  4. Start Recording Video - The following steps must be completed in order to successfully record video:
    1. Unlock the Camera - Unlock the camera for use by MediaRecorder by calling Camera.unlock() .
    2. Configure MediaRecorder - Call in the following MediaRecorder methods in this order . For more information, see the MediaRecorder reference documentation.
      1. setCamera() - Set the camera to be used for video capture, use your application's current instance of Camera .
      2. setAudioSource() - Set the audio source, use MediaRecorder.AudioSource.CAMCORDER .
      3. setVideoSource() - Set the video source, use MediaRecorder.VideoSource.CAMERA .
      4. Set the video output format and encoding. For Android 2.2 (API Level 8) and higher, use the MediaRecorder.setProfile method, and get a profile instance using CamcorderProfile.get() . For versions of Android prior to 2.2, you must set the video output format and encoding parameters:
        1. setOutputFormat() - Set the output format, specify the default setting or MediaRecorder.OutputFormat.MPEG_4 .
        2. setAudioEncoder() - Set the sound encoding type, specify the default setting or MediaRecorder.AudioEncoder.AMR_NB .
        3. setVideoEncoder() - Set the video encoding type, specify the default setting or MediaRecorder.VideoEncoder.MPEG_4_SP .
      5. setOutputFile() - Set the output file, use getOutputMediaFile(MEDIA_TYPE_VIDEO).toString() from the example method in the Saving Media Files section.
      6. setPreviewDisplay() - Specify the SurfaceView preview layout element for your application. Use the same object you specified for Connect Preview .

      Caution: You must call these MediaRecorder configuration methods in this order , otherwise your application will encounter errors and the recording will fail.

    3. Prepare MediaRecorder - Prepare the MediaRecorder with provided configuration settings by calling MediaRecorder.prepare() .
    4. Start MediaRecorder - Start recording video by calling MediaRecorder.start() .
  5. Stop Recording Video - Call the following methods in order , to successfully complete a video recording:
    1. Stop MediaRecorder - Stop recording video by calling MediaRecorder.stop() .
    2. Reset MediaRecorder - Optionally, remove the configuration settings from the recorder by calling MediaRecorder.reset() .
    3. Release MediaRecorder - Release the MediaRecorder by calling MediaRecorder.release() .
    4. Lock the Camera - Lock the camera so that future MediaRecorder sessions can use it by calling Camera.lock() . Starting with Android 4.0 (API level 14), this call is not required unless the MediaRecorder.prepare() call fails.
  6. Stop the Preview - When your activity has finished using the camera, stop the preview using Camera.stopPreview() .
  7. Release Camera - Release the camera so that other applications can use it by calling Camera.release() .

Note: It is possible to use MediaRecorder without creating a camera preview first and skip the first few steps of this process. However, since users typically prefer to see a preview before starting a recording, that process is not discussed here.

Tip: If your application is typically used for recording video, set setRecordingHint(boolean) to true prior to starting your preview. This setting can help reduce the time it takes to start recording.

Configuring MediaRecorder

When using the MediaRecorder class to record video, you must perform configuration steps in a specific order and then call the MediaRecorder.prepare() method to check and implement the configuration. The following example code demonstrates how to properly configure and prepare the MediaRecorder class for video recording.

কোটলিন

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

Prior to Android 2.2 (API Level 8), you must set the output format and encoding formats parameters directly, instead of using CamcorderProfile . This approach is demonstrated in the following code:

কোটলিন

    // 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);

The following video recording parameters for MediaRecorder are given default settings, however, you may want to adjust these settings for your application:

Starting and stopping MediaRecorder

When starting and stopping video recording using the MediaRecorder class, you must follow a specific order, as listed below.

  1. Unlock the camera with Camera.unlock()
  2. Configure MediaRecorder as shown in the code example above
  3. Start recording using MediaRecorder.start()
  4. ভিডিও রেকর্ড করুন
  5. Stop recording using MediaRecorder.stop()
  6. Release the media recorder with MediaRecorder.release()
  7. Lock the camera using Camera.lock()

The following example code demonstrates how to wire up a button to properly start and stop video recording using the camera and the MediaRecorder class.

Note: When completing a video recording, do not release the camera or else your preview will be stopped.

কোটলিন

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

Note: In the above example, the prepareVideoRecorder() method refers to the example code shown in Configuring MediaRecorder . This method takes care of locking the camera, configuring and preparing the MediaRecorder instance.

Releasing the camera

Cameras are a resource that is shared by applications on a device. Your application can make use of the camera after getting an instance of Camera , and you must be particularly careful to release the camera object when your application stops using it, and as soon as your application is paused ( Activity.onPause() ). If your application does not properly release the camera, all subsequent attempts to access the camera, including those by your own application, will fail and may cause your or other applications to be shut down.

To release an instance of the Camera object, use the Camera.release() method, as shown in the example code below.

কোটলিন

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

Caution: If your application does not properly release the camera, all subsequent attempts to access the camera, including those by your own application, will fail and may cause your or other applications to be shut down.

Saving media files

Media files created by users such as pictures and videos should be saved to a device's external storage directory (SD Card) to conserve system space and to allow users to access these files without their device. There are many possible directory locations to save media files on a device, however there are only two standard locations you should consider as a developer:

  • Environment.getExternalStoragePublicDirectory ( Environment.DIRECTORY_PICTURES ) - This method returns the standard, shared and recommended location for saving pictures and videos. This directory is shared (public), so other applications can easily discover, read, change and delete files saved in this location. If your application is uninstalled by the user, media files saved to this location will not be removed. To avoid interfering with users existing pictures and videos, you should create a sub-directory for your application's media files within this directory, as shown in the code sample below. This method is available in Android 2.2 (API Level 8), for equivalent calls in earlier API versions, see Saving Shared Files .
  • Context.getExternalFilesDir ( Environment.DIRECTORY_PICTURES ) - This method returns a standard location for saving pictures and videos which are associated with your application. If your application is uninstalled, any files saved in this location are removed. Security is not enforced for files in this location and other applications may read, change and delete them.

The following example code demonstrates how to create a File or Uri location for a media file that can be used when invoking a device's camera with an Intent or as part of a Building a Camera App .

কোটলিন

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

Note: Environment.getExternalStoragePublicDirectory() is available in Android 2.2 (API Level 8) or higher. If you are targeting devices with earlier versions of Android, use Environment.getExternalStorageDirectory() instead. For more information, see Saving Shared Files .

To make the URI support work profiles, first convert the file URI to a content URI . Then, add the content URI to EXTRA_OUTPUT of an Intent .

For more information about saving files on an Android device, see Data Storage .

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

Android supports a wide array of camera features you can control with your camera application, such as picture format, flash mode, focus settings, and many more. This section lists the common camera features, and briefly discusses how to use them. Most camera features can be accessed and set using the through Camera.Parameters object. However, there are several important features that require more than simple settings in Camera.Parameters . These features are covered in the following sections:

For general information about how to use features that are controlled through Camera.Parameters , review the Using camera features section. For more detailed information about how to use features controlled through the camera parameters object, follow the links in the feature list below to the API reference documentation.

Table 1. Common camera features sorted by the Android API Level in which they were introduced.

বৈশিষ্ট্য API স্তর বর্ণনা
ফেস ডিটেকশন 14 Identify human faces within a picture and use them for focus, metering and white balance
Metering Areas 14 Specify one or more areas within an image for calculating white balance
ফোকাস এলাকা 14 Set one or more areas within an image to use for focus
White Balance Lock 14 Stop or start automatic white balance adjustments
Exposure Lock 14 Stop or start automatic exposure adjustments
Video Snapshot 14 Take a picture while shooting video (frame grab)
টাইম ল্যাপস ভিডিও 11 Record frames with set delays to record a time lapse video
Multiple Cameras 9 Support for more than one camera on a device, including front-facing and back-facing cameras
Focus Distance 9 Reports distances between the camera and objects that appear to be in focus
Zoom 8 Set image magnification
Exposure Compensation 8 Increase or decrease the light exposure level
GPS Data 5 Include or omit geographic location data with the image
White Balance 5 Set the white balance mode, which affects color values in the captured image
Focus Mode 5 Set how the camera focuses on a subject such as automatic, fixed, macro or infinity
Scene Mode 5 Apply a preset mode for specific types of photography situations such as night, beach, snow or candlelight scenes
JPEG Quality 5 Set the compression level for a JPEG image, which increases or decreases image output file quality and size
Flash Mode 5 Turn flash on, off, or use automatic setting
Color Effects 5 Apply a color effect to the captured image such as black and white, sepia tone or negative.
Anti-Banding 5 Reduces the effect of banding in color gradients due to JPEG compression
Picture Format 1 Specify the file format for the picture
Picture Size 1 Specify the pixel dimensions of the saved picture

Note: These features are not supported on all devices due to hardware differences and software implementation. For information on checking the availability of features on the device where your application is running, see Checking feature availability .

Checking feature availability

The first thing to understand when setting out to use camera features on Android devices is that not all camera features are supported on all devices. In addition, devices that support a particular feature may support them to different levels or with different options. Therefore, part of your decision process as you develop a camera application is to decide what camera features you want to support and to what level. After making that decision, you should plan on including code in your camera application that checks to see if device hardware supports those features and fails gracefully if a feature is not available.

You can check the availability of camera features by getting an instance of a camera's parameters object, and checking the relevant methods. The following code sample shows you how to obtain a Camera.Parameters object and check if the camera supports the autofocus feature:

কোটলিন

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
}

You can use the technique shown above for most camera features. The Camera.Parameters object provides a getSupported...() , is...Supported() or getMax...() method to determine if (and to what extent) a feature is supported.

If your application requires certain camera features in order to function properly, you can require them through additions to your application manifest. When you declare the use of specific camera features, such as flash and auto-focus, Google Play restricts your application from being installed on devices which do not support these features. For a list of camera features that can be declared in your app manifest, see the manifest Features Reference .

Using camera features

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

কোটলিন

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

জাভা

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

This technique works for nearly all camera features, and most parameters can be changed at any time after you have obtained an instance of the Camera object. Changes to parameters are typically visible to the user immediately in the application's camera preview. On the software side, parameter changes may take several frames to actually take effect as the camera hardware processes the new instructions and then sends updated image data.

Important: Some camera features cannot be changed at will. In particular, changing the size or orientation of the camera preview requires that you first stop the preview, change the preview size, and then restart the preview. Starting with Android 4.0 (API Level 14) preview orientation can be changed without restarting the preview.

Other camera features require more code in order to implement, including:

  • Metering and focus areas
  • মুখ সনাক্তকরণ
  • টাইম ল্যাপস ভিডিও

A quick outline of how to implement these features is provided in the following sections.

Metering and focus areas

In some photographic scenarios, automatic focusing and light metering may not produce the desired results. Starting with Android 4.0 (API Level 14), your camera application can provide additional controls to allow your app or users to specify areas in an image to use for determining focus or light level settings and pass these values to the camera hardware for use in capturing images or video.

Areas for metering and focus work very similarly to other camera features, in that you control them through methods in the Camera.Parameters object. The following code demonstrates setting two light metering areas for an instance of Camera :

কোটলিন

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

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

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

জাভা

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

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

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

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

camera.setParameters(params);

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

Camera.Area Rect ফিল্ড। এরিয়া অবজেক্ট একটি 2000 x 2000 ইউনিট গ্রিডে ম্যাপ করা একটি আয়তক্ষেত্রাকার আকৃতি বর্ণনা করে। The coordinates -1000, -1000 represent the top, left corner of the camera image, and coordinates 1000, 1000 represent the bottom, right corner of the camera image, as shown in the illustration below.

Figure 1. The red lines illustrate the coordinate system for specifying a Camera.Area within a camera preview. The blue box shows the location and shape of an camera area with the Rect values 333,333,667,667.

The bounds of this coordinate system always correspond to the outer edge of the image visible in the camera preview and do not shrink or expand with the zoom level. Similarly, rotation of the image preview using Camera.setDisplayOrientation() does not remap the coordinate system.

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

For pictures that include people, faces are usually the most important part of the picture, and should be used for determining both focus and white balance when capturing an image. The Android 4.0 (API Level 14) framework provides APIs for identifying faces and calculating picture settings using face recognition technology.

Note: While the face detection feature is running, setWhiteBalance(String) , setFocusAreas(List<Camera.Area>) and setMeteringAreas(List<Camera.Area>) have no effect.

Using the face detection feature in your camera application requires a few general steps:

  • Check that face detection is supported on the device
  • Create a face detection listener
  • Add the face detection listener to your camera object
  • Start face detection after preview (and after every preview restart)

The face detection feature is not supported on all devices. You can check that this feature is supported by calling getMaxNumDetectedFaces() . An example of this check is shown in the startFaceDetection() sample method below.

In order to be notified and respond to the detection of a face, your camera application must set a listener for face detection events. In order to do this, you must create a listener class that implements the Camera.FaceDetectionListener interface as shown in the example code below.

কোটলিন

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

After creating this class, you then set it into your application's Camera object, as shown in the example code below:

কোটলিন

camera?.setFaceDetectionListener(MyFaceDetectionListener())

জাভা

camera.setFaceDetectionListener(new MyFaceDetectionListener());

Your application must start the face detection function each time you start (or restart) the camera preview. Create a method for starting face detection so you can call it as needed, as shown in the example code below.

কোটলিন

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

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

জাভা

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

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

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

কোটলিন

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

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

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

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

জাভা

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

        startFaceDetection(); // start face detection feature

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

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

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

    try {
        mCamera.stopPreview();

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

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

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

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

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

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

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

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

কোটলিন

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

জাভা

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

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

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

Camera fields that require permission

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

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

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

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