Android - कैमरा पूर्वावलोकन बग़ल में है


123

मैं एक पूर्वावलोकन का उपयोग कर रहा हूँ कि कैमरा स्क्रीन पर क्या देखता है।

मैं सब कुछ ठीक काम कर सकता हूं, सतह बनाई गई, सतह सेट और सतह प्रदर्शित की गई है।

हालांकि यह हमेशा चित्र मोड में एक गलत 90 डिग्री कोण पर चित्र प्रदर्शित करता है।

जैसे चित्र में:

वैकल्पिक शब्द

मुझे पता है कि निम्नलिखित कोड का उपयोग करने से चित्र सीधा सेट हो जाएगा:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

हालाँकि मेरे पास एक गतिविधि के भीतर पूर्वावलोकन है जिसमें अन्य तत्व हैं और यह मेरी गतिविधि को परिदृश्य मोड में प्रदर्शित करने के लिए कोई मतलब नहीं है। (डिफ़ॉल्ट रूप से अक्षम)

तो मैं सोच रहा था कि पूर्वावलोकन के अभिविन्यास को बदलने के लिए वैसे भी क्या है? और मेरी गतिविधि के बाकी हिस्सों को पोर्ट्रेट मोड में सही ढंग से प्रदर्शित करें?

या वैसे भी पूर्वावलोकन को घुमाने के लिए ताकि यह सही ढंग से प्रदर्शित हो?


एक नज़र डालें - stackoverflow.com/questions/10259299/…
सुवम रॉय

जवाबों:


145

यह समस्या कुछ हार्डवेयर के साथ बग के रूप में शुरू होने के लिए यहां दिखाई देती है, लेकिन एपीआई 8 में उपलब्ध mCamera.setDisplayOrientation (डिग्री) पर कॉल का उपयोग करके इसे दूर किया जा सकता है। इसलिए इसे मैं इसे लागू करता हूं:

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {            
    if (isPreviewRunning) {
        mCamera.stopPreview();
    }

    Parameters parameters = mCamera.getParameters();
    Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if(display.getRotation() == Surface.ROTATION_0) {
        parameters.setPreviewSize(height, width);                           
        mCamera.setDisplayOrientation(90);
    }

    if(display.getRotation() == Surface.ROTATION_90) {
        parameters.setPreviewSize(width, height);                           
    }

    if(display.getRotation() == Surface.ROTATION_180) {
        parameters.setPreviewSize(height, width);               
    }

    if(display.getRotation() == Surface.ROTATION_270) {
        parameters.setPreviewSize(width, height);
        mCamera.setDisplayOrientation(180);
    }

    mCamera.setParameters(parameters);
    previewCamera();                      
}

And the previewCamera method :

public void previewCamera() {        
    try {           
        mCamera.setPreviewDisplay(mSurfaceHolder);          
        mCamera.startPreview();
        isPreviewRunning = true;
    } catch(Exception e) {
        Log.d(APP_CLASS, "Cannot start preview", e);    
    }
}

यह एक एचटीसी डिजायर पर था और मुझे रोटेशन की प्रत्येक जाँच में शुरू में लॉगिंग स्टेटमेंट में यह कहने के लिए रखा गया था कि रोटेशन क्या था और फिर डिवाइस पर डिबग किया और लॉगकैट आउटपुट को देखा जब मैंने डिवाइस को घुमाया। एचटीसी डिजायर के लिए, 0 फोन था जैसा कि आपने उम्मीद की थी (पोर्ट्रेट), 90 डिग्री 90 डिग्री फोन को घुमा रहा था COUNTER-CLOCKWISE (मुझे लगता था कि यह घड़ी की दिशा में होता)। कोड में आप देखेंगे कि जब फोन 90 या 180 डिग्री पर था, तो मुझे किसी भी डिस्प्ले रोटेशन को करने की आवश्यकता नहीं थी - डिवाइस खुद को संभालने के लिए लग रहा था। केवल एक बिंदु ठीक से काम नहीं कर रहा है: 270 डिग्री रोटेशन तब होता है जब आप डिवाइस को 90 डिग्री क्लॉकवाइज और डिस्प्ले रोटेशन काउंटर्स को चालू करते हैं जो ठीक है लेकिन अगर आप डिवाइस को 270 डिग्री काउंटर-क्लॉकवाइज घुमाते हैं, तो यह ठीक से क्षतिपूर्ति नहीं करता है।

पीएस उचित घुमावों में चौड़ाई और ऊंचाई के स्वैप को नोट करें।


7
लेकिन सेटडिसप्लेऑरिएशन (डिग्री); विधि का समर्थन करता है फार्म 2.2, कम संस्करण के बारे में क्या ?? parameters.setRotation (90); पैरामीटर ।सेट ("अभिविन्यास", "पोर्ट्रेट"); काम नहीं कर रहे हैं। यदि आपके पास निम्न संस्करणों का कोई समाधान है, तो कृपया मेरी मदद करें।
विक्रम

1
मैंने अपने ऐप पर एक पूर्वावलोकन लागू किया जो हमेशा पोर्ट्रेट मोड में दिखाई देगा। मैं हमेशा स्क्रीन को 90 डिग्री से घुमा रहा था और यह हर डिवाइस पर काम करने लगता था, जब तक कि हमने इसे HTC Desire C. पर परीक्षण नहीं कर लिया था। जैसा कि मैंने इस परीक्षण के लिए अब डिवाइस पर भरोसा नहीं किया है, मैं आपको यह स्पष्ट करना चाहूंगा कि क्या यह आपको ठीक करता है सुझाव है कि अंत में एचटीसी की इच्छा पर अच्छा काम किया है। धन्यवाद!
आर्गेनकवि

13
यह mCamera.setParameters(parameters);कथन मेरे ऐप को क्रैश कर देता है, क्योंकि सतह आयाम मेरे फ़ोन के लिए एक मान्य पूर्वावलोकन आकार नहीं हैं (हो सकता है कि क्योंकि मैं स्थिति बार दृश्यमान हूं)। हालाँकि, मैंने पाया कि उपयोग करनाmCamera.setDisplayOrientation(90) तब mCamera.setPreviewDisplay(mSurfaceHolder);मापदंडों को सेट किए बिना करना भी काम करता था!
निकोपिको

3
एक स्विच स्टेटमेंट के साथ क्लीनर होगा
सियावाश

2
क्या यह नहीं लगता कि पूर्वावलोकन सभी उपकरणों पर बग़ल में है? क्योंकि यह कुछ उपकरणों पर बग़ल में है और दूसरों पर सही है .... क्या यह देखने का तरीका है कि क्या कोई डिवाइस फोन के पोर्ट्रेट साइड के साथ डिफ़ॉल्ट कैमरा ओरिएंटेशन इनलाइन है या नहीं?
सियावश

16

प्रदर्शन अभिविन्यास सेट करने का प्रयास करें। यह मेरी समस्या का समाधान करता है।

 mCamera.setDisplayOrientation(90);

5
बचत के समय यह परिदृश्य में चित्र छवि को बचाता है। कोई समाधान?
आकांक्षा राठौर

@ आकांक्षा: यह ध्वज केवल पूर्वावलोकन प्रदर्शन पर लागू होता है। यह बफ़र के उन्मुखीकरण को नहीं onPreviewFrame()onPictureTaken()
लौटाता है

13
 public void surfaceCreated(SurfaceHolder holder) {
     mCamera = Camera.open();
     mCamera.setDisplayOrientation(90);
     try {
         mCamera.setPreviewDisplay(holder);
         mCamera.setPreviewCallback(new PreviewCallback() {

             @Override
             public void onPreviewFrame(byte[] data, Camera camera) {
             }
         });

     } catch (Exception e) {
         e.printStackTrace();
     }
}

इस कोड को आज़माएं


3
बचत के समय यह परिदृश्य में चित्र छवि को बचाता है। कोई समाधान?
आकांक्षा राठौर

@ आकांक्षा जो शायद EXIF ​​मापदंडों के साथ क्या करना है।
एपिकपांडाफायर

4

मुझे फ्रंट कैमरा (अपसाइड डाउन इश्यू) की समस्या थी। फिर मैंने Android डॉक्स में प्रलेखित निम्न विधि का उपयोग किया -

public void setCameraDisplayOrientation(Activity activity , int icameraId , Camera camera1s)
    {
        CameraInfo cameraInfo = new CameraInfo();

        Camera.getCameraInfo(icameraId, cameraInfo);

        int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();

        int degrees = 0; // k

        switch (rotation)
        {
        case Surface.ROTATION_0:
            degrees = 0;
            break;
        case Surface.ROTATION_90:
            degrees = 90;
            break;
        case Surface.ROTATION_180:
            degrees = 180;
            break;
        case Surface.ROTATION_270:
            degrees = 270;
            break;

        }

        int result;

        if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT)
        {
            // cameraType=CAMERATYPE.FRONT;

            result = (cameraInfo.orientation + degrees) % 360;
            result = (360 - result) % 360; // compensate the mirror

        }
        else
        { // back-facing

            result = (cameraInfo.orientation - degrees + 360) % 360;

        }
        // displayRotate=result;
        camera.setDisplayOrientation(result);


    }

3
यह विधि कैमरा प्रलेखन से आती है: developer.android.com/reference/android/hardware/…
विंसफायर

@VinceFior कुछ भी गलत है अगर वह आधिकारिक दस्तावेज़ से पोस्ट करता है?
रंजीथ कुमार

1
@ रंजीथकुमार विशेष रूप से नहीं, मैं सिर्फ स्रोत और लोगों को अधिक संदर्भ के लिए इसका श्रेय देना चाहता था। :)
विंसफायर

3

मैंने इसे mCamera.setDisplayOrientation (90) की सलाह लेते हुए किया; लेकिन बिटमैप को भी घुमाया क्योंकि किसी कारणवश अन्य लोग मेरे लिए वर्जन 2.3.3 में काम नहीं करते।

बिटमैप को घुमाने के लिए मैंने ऐसा किया:

Matrix matrix = new Matrix();
matrix.postRotate(90);
imageView1 = new ImageView(this);
Bitmap bitmap = BitmapFactory.decodeFile(files[i].getAbsolutePath());
Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(rotatedBitmap, 80, 80, true);
imageView1.setImageBitmap(scaledBitmap);

0

मैंने अपने कोड की तुलना एक ट्यूटोरियल से की है और अंत में जो तय किया है वह निम्नलिखित कोड को अपने AndroidManifext.xml: <activity>टैग में डाल रहा है :

android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">

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

    try {
        mCamera.stopPreview();
    } catch (Exception e) {
        e.printStackTrace();
    }

    Camera.Parameters parameters = mCamera.getParameters();
    Display display = ((WindowManager) getContext().getSystemService(WINDOW_SERVICE)).getDefaultDisplay();

    if (display.getRotation() == Surface.ROTATION_0) {
        parameters.setPreviewSize(h, w);
        mCamera.setDisplayOrientation(90);
    }

    if (display.getRotation() == Surface.ROTATION_90) {
        parameters.setPreviewSize(w, h);
        mCamera.setDisplayOrientation(0);
    }

    if (display.getRotation() == Surface.ROTATION_180) {
        parameters.setPreviewSize(h, w);
        mCamera.setDisplayOrientation(270);
    }

    if (display.getRotation() == Surface.ROTATION_270) {
        parameters.setPreviewSize(w, h);
        mCamera.setDisplayOrientation(180);
    }

    previewCamera();
}

public void previewCamera() {
    try {
        mCamera.setPreviewDisplay(mHolder);
        mCamera.startPreview();
    } catch (Exception e) {
        //Log.d(APP_CLASS, "Cannot start preview", e);
        e.printStackTrace();
    }
}

0

मुझे लगता है SENSOR_ORIENTATION का मूल्य यह बताएगा 90 डिग्री पर हार्डकोडिंग के बजाय रोटेशन के लिए किस मूल्य का उपयोग किया जाए

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
        if (manager == null) {
            Log.i(TAG, "camera manager is null");
            return;
        }
        for (String id: manager.getCameraIdList()) {
            CameraCharacteristics characteristics = manager.getCameraCharacteristics(id);
            Integer orientation = characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
            Log.i(TAG, "camera sensor orientation is " + orientation);
        }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.