Programming

Android-카메라 미리보기가 옆으로

procodes 2020. 7. 11. 22:54
반응형

Android-카메라 미리보기가 옆으로


미리보기를 사용하여 카메라에 화면에 표시되는 내용을 표시하고 있습니다.

모든 것이 잘 작동하고 표면이 생성되고 표면이 설정되고 표면이 표시됩니다.

그러나 세로 모드에서는 항상 그림을 잘못된 90도 각도로 표시합니다.

그림과 같이 :

대체 텍스트

다음 코드를 사용하면 그림이 똑바로 설정됩니다.

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 Desire의 경우 0은 예상 한대로 전화였으며 (세로), 90 도는 전화를 90도 COUNTER-CLOCKWISE로 돌리고있었습니다 (시계 방향 인 것으로 가정). 코드에서 전화가 90도 또는 180도 일 때 디스플레이 회전을 수행 할 필요가 없다는 것을 알 수 있습니다. 장치 가이 자체를 처리하는 것처럼 보였습니다. 한 점만 제대로 작동하지 않는 경우 : 270도 회전은 장치를 시계 방향으로 90도 돌리고 디스플레이 회전 카운터가 정상이지만 장치를 시계 반대 방향으로 270도 회전하면 제대로 보정되지 않는 것 같습니다.

PS 적절한 회전에서 너비와 높이의 교체에 유의하십시오.


디스플레이 방향을 설정하십시오. 내 문제를 해결합니다.

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

이 코드를 사용해보십시오


프론트 카메라에 문제가있었습니다 (거꾸로 발생하는 문제). 그럼 난에 기록 된 다음과 같은 방법을 사용 안드로이드 오피스 -

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

내 코드를 튜토리얼 1과 비교하고 마지막으로 수정 한 것은 다음 코드를 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();
    }
}

참고 URL : https://stackoverflow.com/questions/3841122/android-camera-preview-is-sideways

반응형