سؤال

أنا أستخدم معاينة لعرض ما ترى الكاميرا على الشاشة.

يمكنني الحصول على كل شيء يعمل بشكل جيد ، وخلق السطح ، ومجموعة السطح ويتم عرض السطح.

ومع ذلك ، فإنه يعرض الصورة دائمًا بزاوية 90 درجة غير صحيحة في وضع الصورة.

كما في الصورة:

alt text

أدرك أن استخدام الكود التالي سيعين الصورة مباشرة:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

ومع ذلك ، لديّ المعاينة ضمن نشاط له عناصر أخرى فيه ولا من المنطقي عرض نشاطي في وضع المناظر الطبيعية. (معطل افتراضي)

لذلك كنت أتساءل هل هناك على أي حال لتغيير اتجاه المعاينة؟ واترك بقية نشاطي المعروضة بشكل صحيح في وضع الصورة؟

أو على أي حال لتدوير المعاينة بحيث يتم عرضها بشكل صحيح؟

هل كانت مفيدة؟

المحلول

يبدو أن هذه المشكلة تبدأ بمثابة خطأ مع أجهزة معينة انظر هنا ولكن يمكن التغلب عليها باستخدام مكالمة إلى McAmera.setDisplayorientation (الدرجات) المتاحة في API 8. لذلك هكذا أقوم بتنفيذها:

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

كان هذا على رغبة HTC واضطررت في البداية إلى وضع عبارات التسجيل في كل من عمليات فحص الدوران لأقول ما كان عليه الدوران ثم تصحيحه على الجهاز وشاهدت إخراج logcat أثناء تدوير الجهاز. بالنسبة لرغبة HTC ، كان 0 هو الهاتف كما كنت تتوقع (صورة) ، 90 درجة كانت تحول الهاتف 90 درجة عكس اتجاه عقارب الساعة (كنت قد افترضت أنه كان في اتجاه عقارب الساعة). في الكود ، سترى أنني لست بحاجة إلى القيام بأي دوران عرض عندما كان الهاتف عند 90 أو 180 درجة - بدا أن الجهاز يتعامل مع هذا نفسه. نقطة واحدة فقط لا تعمل بشكل صحيح: دوران 270 درجة هو عندما تقوم بتشغيل الجهاز 90 درجة في اتجاه عقارب الساعة وعدادات دوران العرض على ما يرام ولكن إذا قمت بتدوير الجهاز 270 درجة في اتجاه عقارب الساعة ، فإنه لا يبدو أنه يعوضه بشكل صحيح.

ملاحظة: لاحظ swapover من العرض والارتفاع في الدورات المناسبة.

نصائح أخرى

حاول تعيين اتجاه العرض. يحل مشكلتي.

 mCamera.setDisplayOrientation(90);
 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();
     }
}

جرب هذا الرمز

كنت أواجه مشكلة في الكاميرا الأمامية (رأسًا على عقب). ثم استخدمت الطريقة التالية الموثقة في مستندات 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);


    }

فعلت ذلك أخذ المشورة من 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);

لقد قارنت الكود الخاص بي بالبرنامج التعليمي وما الذي تم إصلاحه أخيرًا هو وضع الكود التالي في Androidmanifext.xml: في <activity> بطاقة شعار:

android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
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();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top