অ্যান্ড্রয়েড - ক্যামেরার প্রাকদর্শন পাশাপাশি রয়েছে


123

স্ক্রিনে ক্যামেরাটি কী দেখায় তা প্রদর্শন করতে আমি একটি পূর্বরূপ ব্যবহার করছি।

আমি সবকিছু সূক্ষ্মভাবে কাজ করতে, পৃষ্ঠ তৈরি, পৃষ্ঠের সেট এবং পৃষ্ঠটি প্রদর্শিত করতে পারি।

তবে এটি সর্বদা প্রতিকৃতি মোডে একটি 90 ডিগ্রি কোণে ভুল চিত্রটি প্রদর্শন করে।

যেমন ছবিতে:

বিকল্প পাঠ

আমি সচেতন যে নিম্নলিখিত কোড ব্যবহার করে ছবিটি সোজা সেট করবে:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

তবে আমার একটি ক্রিয়াকলাপের মধ্যে পূর্বরূপ রয়েছে যাতে অন্যান্য উপাদান রয়েছে এবং এটি আমার ক্রিয়াকলাপটি ল্যান্ডস্কেপ মোডে প্রদর্শিত হবে তা বোঝা যায় না। (এটি ডিফল্টরূপে অক্ষম)

তাই আমি ভাবছিলাম যে কেবলমাত্র পূর্বরূপের দৃষ্টিভঙ্গি বদলাতে হবে? এবং আমার বাকী ক্রিয়াকলাপটি সঠিকভাবে প্রতিকৃতি মোডে প্রদর্শিত হবে?

বা যাইহোক পূর্বরূপটি ঘোরানোর জন্য যাতে এটি সঠিকভাবে প্রদর্শিত হয়?


- একটি চেহারা আছে stackoverflow.com/questions/10259299/...
Suvam রায়

উত্তর:


145

এই সমস্যাটি এখানে নির্দিষ্ট হার্ডওয়ারের সাথে বাগ হিসাবে শুরু হয়েছিল বলে মনে হয়েছিল তবে API 8 তে উপলব্ধ mCamera.setDisplayOrientation (ডিগ্রি) এ কলটি ব্যবহার করে অতিক্রম করা যেতে পারে So সুতরাং আমি এটি কীভাবে এটি প্রয়োগ করি:

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

এটি একটি এইচটিসি ডিজায়ারে ছিল এবং ঘূর্ণনটি কী তা বলতে প্রথমে আমাকে প্রথমে প্রতিটি রোটেশন চেকটিতে লগিংয়ের বিবৃতি দিতে হয়েছিল এবং তারপরে ডিভাইসটি ঘোরার সময় লগগেট আউটপুট দেখেছিলাম output এইচটিসি ডিজায়ারের জন্য 0 ফোনটি ছিল যেমনটি আপনি প্রত্যাশা করেছিলেন (প্রতিকৃতি), 90 ডিগ্রি ফোনটি 90 ডিগ্রি COUNTER-CLOCKWISE ঘুরিয়ে দিচ্ছিল (আমি ধরে নিয়েছিলাম এটি ঘড়ির কাঁটার দিকে হবে)। কোডটিতে আপনি দেখতে পাবেন যে ফোনটি 90 বা 180 ডিগ্রি ছিল তখন আমার কোনও ডিসপ্লে রোটেশন করার দরকার নেই - ডিভাইসটি এটি নিজেই হ্যান্ডেল করেছে বলে মনে হচ্ছে। কেবলমাত্র একটি পয়েন্ট সঠিকভাবে কাজ করছে না: আপনি যখন ডিভাইসটিকে 90 ডিগ্রি ঘড়ির কাঁটার দিকে ঘুরিয়ে দেন তখন 270 ডিগ্রি ঘূর্ণন হয় এবং ঠিক যদি আপনি ডিভাইসটি 270 ডিগ্রি ঘড়ির কাঁটার বিপরীতে ঘোরান তবে এটি সঠিকভাবে ক্ষতিপূরণ হিসাবে উপস্থিত হয় না।

পিএস যথাযথ ঘোরাফেরা প্রস্থ এবং উচ্চতার swapover নোট করুন।


7
কিন্তু সেটডিসপ্লে ওরিয়েন্টেশন (ডিগ্রি); পদ্ধতিটি ফর্ম ২.২ সমর্থন করে, নিম্ন সংস্করণ সম্পর্কে কী ?? parameters.setRotation (90); পরামিতি.সেট ("ওরিয়েন্টেশন", "প্রতিকৃতি"); কাজ করছে না নিম্ন সংস্করণগুলির জন্য আপনার যদি কোনও সমাধান থাকে তবে দয়া করে আমাকে সহায়তা করুন।
বিক্রম

1
আমি আমার অ্যাপ্লিকেশনটিতে একটি পূর্বরূপ প্রয়োগ করেছি যা সর্বদা প্রতিকৃতি মোডে প্রদর্শিত হবে। আমি সর্বদা 90 ডিগ্রি দ্বারা স্ক্রিনটি ঘোরছিলাম এবং এটি এইচটিসি ডিজায়ার সিটিতে পরীক্ষা না করা পর্যন্ত এটি প্রতিটি ডিভাইসে কাজ করে বলে মনে হচ্ছে যেহেতু এটি পরীক্ষা করার জন্য আমি এখন ডিভাইসে বিশ্বাস করি না, আমি আপনাকে স্পষ্ট করে বলতে চাই যদি এটি ঠিক করে দেয় তবে অবশেষে এইচটিসি ইচ্ছাতে ভাল কাজ করার পরামর্শ দিন suggest ধন্যবাদ!
আরগেনকিউই

13
mCamera.setParameters(parameters);বিবৃতি, আমার অ্যাপ্লিকেশন ক্র্যাশ কারণ পৃষ্ঠ মাত্রা আমার ফোন জন্য একটি বৈধ পূর্বরূপ আকার নয় (হয়তো কারণ আমি স্ট্যাটাস বার দৃশ্যমান খাক?)। তবে, আমি দেখতে পেলাম যে প্যারামিটার সেট না করেই mCamera.setDisplayOrientation(90)তখন ব্যবহার করা mCamera.setPreviewDisplay(mSurfaceHolder);খুব বেশি কাজ করেছিল!
নিকোপিকো

3
একটি স্যুইচ বিবৃতি দিয়ে ক্লিনার হবে
সায়াভাশ

2
এটি কি ধরে নেয় না যে পূর্বরূপটি সমস্ত ডিভাইসের পাশে রয়েছে? কারণ এটি কিছু ডিভাইসে পাশাপাশি রয়েছে এবং অন্যদের উপরে ডান দিকে .... কোনও ডিভাইস ডিফল্ট ক্যামেরা ওরিয়েন্টেশন ফোনের প্রতিকৃতির সাথে ইনলাইন আছে কিনা তা দেখার জন্য কোনও উপায় আছে কি না?
সায়াভাশ

16

প্রদর্শন ওরিয়েন্টেশন সেট করার চেষ্টা করুন। এটি আমার সমস্যা সমাধান করে।

 mCamera.setDisplayOrientation(90);

5
সংরক্ষণের সময় ল্যান্ডস্কেপে প্রতিকৃতি চিত্রটি সংরক্ষণ করে? কোনও সমাধান?
আকঙ্কশা রাঠোর

@ আকঙ্কা: এই পতাকাটি কেবলমাত্র পূর্বরূপ প্রদর্শনের জন্য প্রযোজ্য। এটা তোলে পরিবর্তন করে না বাফার সজ্জাতে ফিরে onPreviewFrame()বাonPictureTaken()
অ্যালেক্স Cohn

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
সংরক্ষণের সময় ল্যান্ডস্কেপে প্রতিকৃতি চিত্রটি সংরক্ষণ করে? কোনও সমাধান?
আকঙ্কশা রাঠোর

@ আকঙ্কা যা সম্ভবত এক্সআইএফ পরামিতিগুলির সাথে করতে হবে।
এপিকপান্ডাফোর্স

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
এই পদ্ধতিটি ক্যামেরার ডকুমেন্টেশন থেকে আসে: ডেভেলপার.অ্যান্ড্রয়েড
রেফারেন্স

@ ভিনসফায়ার যদি কিছু সরকারী দস্তাবেজ থেকে পোস্ট করেন তবে কিছু ভুল?
রঞ্জিত কুমার

1
@ রঞ্জিতকুমার বিশেষত নয়, আমি কেবল উত্সকে creditণ দিতে চেয়েছি এবং লোকদের আরও প্রসঙ্গের জন্য নির্দেশ করতে চাই। :)
ভিনসফায়ার

3

আমি mCamera.setDisplayOrientation (90) এর পরামর্শ নিয়ে এটি করেছি; তবে বিটম্যাপটিও ঘোরানো হয়েছে কারণ কোনও কারণে অন্যরা কাছে পৌঁছেছে এটি আমার জন্য সংস্করণ ২.৩.৩ এ কাজ করে না।

বিটম্যাপ ঘোরানোর জন্য আমি এটি করেছি:

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

আমি আমার কোডটিকে টিউটোরিয়ালটির সাথে তুলনা করেছি এবং শেষ পর্যন্ত কী ঠিক করেছে এটি আমার কোডটি অ্যান্ড্রয়েড ম্যানিফেক্স্ট.এক্সএমএলে নিম্নলিখিত কোডটি রাখছিল: <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);
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.