मैं एंड्रॉइड प्लेटफॉर्म पर "फ्रंट कैमरा" कैसे खोल सकता हूं?


82

आम तौर पर, यदि किसी डिवाइस में एक से अधिक एम्बेडेड कैमरा होता है, तो क्या उनमें से किसी एक को विशेष रूप से आरंभ करने का एक तरीका है?

मुझे Android संदर्भ दस्तावेज़ में यह नहीं मिला:

सैमसंग SHW-M100S में दो कैमरे हैं। अगर दो कैमरों का उपयोग करने के लिए कोई संदर्भ नहीं है, तो कोई भी विचार सैमसंग ने कैसे किया ...?


जवाबों:


114
private Camera openFrontFacingCameraGingerbread() {
    int cameraCount = 0;
    Camera cam = null;
    Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
    cameraCount = Camera.getNumberOfCameras();
    for (int camIdx = 0; camIdx < cameraCount; camIdx++) {
        Camera.getCameraInfo(camIdx, cameraInfo);
        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            try {
                cam = Camera.open(camIdx);
            } catch (RuntimeException e) {
                Log.e(TAG, "Camera failed to open: " + e.getLocalizedMessage());
            }
        }
    }

    return cam;
}

AndroidManifest.xmlफ़ाइल में निम्नलिखित अनुमतियाँ जोड़ें :

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />

नोट: यह सुविधा जिंजरब्रेड (2.3) और अप एंड्रॉइड वर्जन में उपलब्ध है।


क्या Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);मौजूदा कैमरा ऐप को खोलने के लिए तकनीक के साथ किसी तरह इसका उपयोग करना संभव है ?
loeschg

3
@loeschg Intentअपने तरीके से कैमरा एक्शन संभालती है। इस तकनीक का उपयोग तब किया जाता है जब आप SurfaceViewकैमरा कार्यक्षमता का उपयोग करने के लिए उपयोग कर रहे हैं ।

यह वह है जिसका मैंने अंदाज़ लगाया था। धन्यवाद!
loeschg

2
बहुत मस्त पोस्ट। मुझे यह जानने में थोड़ा समय लगा कि कैमरा फेसिंग कैमरा इंडेक्स की तुलना में एक जैसा नहीं है। उदाहरण के लिए मेरे टैबलेट में केवल एक कैमरा (इंडेक्स: 0) है, लेकिन सामने की ओर (इंडेक्स का सामना करना पड़ रहा है: 1)। इसलिए Camera.open (CameraInfo.CAMERA_FACING_FRONT) जैसे सरल कोड का उपयोग करना बकवास है।
मथायस

@ मैथियास आपसे सहमत हूँ। जैसा कि हमारे पास अलग-अलग ओईएम हैं, हमारी प्रोग्रामिंग तकनीक हमारी जरूरतों के अनुसार बदल जाती है। हाइलाइट करने के लिए धन्यवाद।

14

Google द्वारा सभी पुराने उत्तरों के तरीकों को चित्रित किया गया है (इस तरह की परेशानियों के कारण), एपीआई 21 के बाद से आपको कैमरा आईडी एपीआई का उपयोग करने की आवश्यकता है :

यह वर्ग एपीआई स्तर 21 में पदावनत किया गया था। हम नए अनुप्रयोगों के लिए नए android.hardware.camera2 एपीआई का उपयोग करने की सलाह देते हैं।

में नए एपीआई आप लगभग पूरा हो गया बिजली एंड्रॉयड डिवाइस कैमरा और प्रलेखन स्पष्ट रूप से करने के लिए सलाह से अधिक

String[] getCameraIdList()

और फिर कैमरा खोलने के लिए प्राप्त CameraId का उपयोग करें:

void openCamera(String cameraId, CameraDevice.StateCallback callback, Handler handler)

ललाट कैमरों के 99% में आईडी = "1" है, और बैक कैमरा आईडी = "0" इस के अनुसार:

गैर-हटाने योग्य कैमरे अपने पहचानकर्ताओं के लिए 0 से शुरू होने वाले पूर्णांक का उपयोग करते हैं, जबकि हटाने योग्य कैमरों में प्रत्येक व्यक्तिगत डिवाइस के लिए एक विशिष्ट पहचानकर्ता होता है, भले ही वे एक ही मॉडल हों।

हालांकि , इसका मतलब यह है कि अगर डिवाइस की स्थिति दुर्लभ है जैसे कि 1-ललाट -कैमरा टैबलेट आपको गिनने की जरूरत है कि आपके पास कितने एम्बेडेड कैमरे हैं, और कैमरे के क्रम को इसके महत्व ("0") के साथ रखें। तो CAMERA_FACING_FRONT == 1 CAMERA_FACING_BACK == 0, जिसका अर्थ है कि बैक कैमरा ललाट से अधिक महत्वपूर्ण है।

मुझे सभी Android उपकरणों पर ललाट कैमरे की पहचान करने के लिए एक समान विधि के बारे में नहीं पता है। सीधे शब्दों में कहा जाए, तो डिवाइस के अंदर का Android OS वास्तव में यह पता नहीं लगा सकता कि कौन सा कैमरा कुछ कारणों से ठीक है: शायद केवल कैमरा हार्डकोड आईडी एक पूर्णांक है जो इसके महत्व का प्रतिनिधित्व करता है या हो सकता है कि जो भी आपके पास होगा कुछ उपकरणों पर। " वापस"।

प्रलेखन : https://developer.android.com/reference/android/hardware/camera2/package-summax.html

स्पष्ट उदाहरण : https://github.com/googlesamples/android-Camera2Basic


पुराने एपीआई के लिए (यह अनुशंसित नहीं है, क्योंकि यह आधुनिक फोन पर नए एंड्रॉइड संस्करण पर काम नहीं करेगा और हस्तांतरण एक दर्द-इन-गधा है)। इस उत्तर में ललाट कैमरा खोलने के लिए बस एक ही Integer CameraID (1) का उपयोग करें :

cam = Camera.open(1);

अगर आपको कैमरा पार्ट करने के लिए ओपनसीवी पर भरोसा है :

के भीतर

    <org.opencv.android.JavaCameraView
    ../>

ललाट कैमरे के लिए निम्नलिखित का उपयोग करें:

        opencv:camera_id="1"

10

एंड्रॉइड 2.1 के रूप में, एंड्रॉइड अपने एसडीके में केवल एक ही कैमरा का समर्थन करता है। संभावना है कि इसे भविष्य के एंड्रॉइड रिलीज़ में जोड़ा जाएगा।


1
यह आँकड़ा Android 2.2 aswell के लिए मान्य है?
ozmank

2
@ozmank: हाँ, एंड्रॉइड 2.3 तक कई-कैमरा समर्थन नहीं जोड़ा गया था।
कॉमन्सवेयर

4
public void surfaceCreated(SurfaceHolder holder) {
    try {
        mCamera = Camera.open();
        mCamera.setDisplayOrientation(90);
        mCamera.setPreviewDisplay(holder);

        Camera.Parameters p = mCamera.getParameters();
        p.set("camera-id",2);
        mCamera.setParameters(p);   
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

3
गैलेक्सी एस महत्वपूर्ण "कैमरा-आईडी" पर अच्छा काम नहीं "कैमरा_ड"
महेश

3
कभी नहीं मानें कि 90 डिग्री आपको चित्र के लिए सही रोटेशन मिलेगा। यह कई उपकरणों पर अलग है।
बृहस्पतिवार को 16:23 बजे

4

API 21 (5.0) के लिए और बाद में आप CameraManager API का उपयोग कर सकते हैं

try {
    String desiredCameraId = null;
    for(String cameraId : mCameraIDsList) {
        CameraCharacteristics chars =  mCameraManager.getCameraCharacteristics(cameraId);
        List<CameraCharacteristics.Key<?>> keys = chars.getKeys();
        try {
            if(CameraCharacteristics.LENS_FACING_FRONT == chars.get(CameraCharacteristics.LENS_FACING)) {
               // This is the one we want.
               desiredCameraId = cameraId;
               break;
            }
        } catch(IllegalArgumentException e) {
            // This key not implemented, which is a bit of a pain. Either guess - assume the first one
            // is rear, second one is front, or give up.
        }
    }
}

4

पिछला कैमरा खोलने के लिए : -

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)

फ्रंट कैमरा खोलने के लिए : -

val cameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
when {
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1 && Build.VERSION.SDK_INT < Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT)  // Tested on API 24 Android version 7.0(Samsung S6)
     }
     Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
         cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", CameraCharacteristics.LENS_FACING_FRONT) // Tested on API 27 Android version 8.0(Nexus 6P)
         cameraIntent.putExtra("android.intent.extra.USE_FRONT_CAMERA", true)
     }
     else -> cameraIntent.putExtra("android.intent.extras.CAMERA_FACING", 1)  // Tested API 21 Android version 5.0.1(Samsung S4)
}
startActivityForResult(cameraIntent, REQUEST_CODE_CAMERA)

मैं इसे एपीआई 28 और इसके बाद के संस्करण के लिए काम नहीं कर सका। साथ ही, कुछ उपकरणों में सीधे कैमरा खोलना संभव नहीं है (निर्माता पर निर्भर करता है)।


2

एंड्रॉइड 2.3 (जिंजरब्रेड) की रिहाई के साथ , अब आप android.hardware.Cameraकैमरे की संख्या, एक विशिष्ट कैमरे के बारे में जानकारी प्राप्त करने के लिए वर्ग का उपयोग कर सकते हैं , और एक विशिष्ट के लिए एक संदर्भ प्राप्त कर सकते हैं Cameraयहां नए Cameraएपीआई देखें ।


1

build.gradle

 dependencies {
       compile 'com.google.android.gms:play-services-vision:9.4.0+'
    }

दृश्य सेट करें

CameraSourcePreview mPreview = (CameraSourcePreview) findViewById(R.id.preview);

GraphicOverlay mGraphicOverlay = (GraphicOverlay) findViewById(R.id.faceOverlay);

CameraSource mCameraSource = new CameraSource.Builder(context, detector)
                            .setRequestedPreviewSize(640, 480)
                            .setFacing(CameraSource.CAMERA_FACING_FRONT)
                            .setRequestedFps(30.0f)
                            .build();

           mPreview.start(mCameraSource, mGraphicOverlay);

0
Camera camera;   
if (Camera.getNumberOfCameras() >= 2) {

    //if you want to open front facing camera use this line   
    camera = Camera.open(CameraInfo.CAMERA_FACING_FRONT);

    //if you want to use the back facing camera
    camera = Camera.open(CameraInfo.CAMERA_FACING_BACK);                
}

try {
    camera.setPreviewDisplay("your surface holder here");
    camera.startPreview();      
} catch (Exception e) {  
    camera.release();
}

/ * यह उचित तरीका नहीं है, यह पुराने उपकरणों के लिए एक समाधान है जो एंड्रॉइड 4.0 या पुराने को चलाते हैं। इसका उपयोग परीक्षण उद्देश्यों के लिए किया जा सकता है, लेकिन मुख्य विकास के लिए अनुशंसित नहीं है। इस समाधान को केवल एक अस्थायी समाधान माना जा सकता है। लेकिन इस समाधान ने बहुतों की मदद की है इसलिए मेरा इस उत्तर को हटाने का इरादा नहीं है * /


7
मुझे नहीं लगता कि यह प्रलेखित उपयोग है। open (int id) आईडी स्वीकार करता है, कैमरा स्थिति नहीं
XY

13
कृपया इस भ्रामक उत्तर को हटा दें
एलेक्स कोहेन

13
@AalanDhananjayan: उदाहरण के लिए @Matthias द्वारा टिप्पणी ऊपर देखें : ... मुझे कुछ समय लगा कि यह पता लगाने के लिए कि कैमरा सामना करना पड़ रहा है कैमरा सूचकांक की तुलना में एक समान नहीं है। उदाहरण के लिए मेरे टैबलेट में केवल एक कैमरा (इंडेक्स: 0) है, लेकिन सामने की ओर (इंडेक्स का सामना करना पड़ रहा है: 1)। इसलिए Camera.open (CameraInfo.CAMERA_FACING_FRONT) जैसे सरल कोड का उपयोग करना बकवास है।
एलेक्स कोहेन

5
यह बाल्डशैश है। यह भी उपयोग करने का प्रयास न करें।
एडम

4
यह भयावह है। कभी ऐसा मत करो। इस जवाब पर रोक लगनी चाहिए। Camera.open () एक कैमरा आईडी को स्वीकार करता है, न कि कैमरे के सामने का क्रमिक मान! यह उपकरणों के एक महत्वपूर्ण अल्पसंख्यक में विफल रहता है और केवल सरासर गूंगा भाग्य के माध्यम से काम करता है।
बृहस्पतिवार 16
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.