簡體   English   中英

自定義相機以錯誤的方向顯示預覽並縮放了android圖像

[英]Custom camera displays preview in wrong orientation and zoomed image android

我正在使用簡單的自定義相機 ,單擊按鈕即可拍照。

即使手機處於縱向模式,相機也會以錯誤的方向(橫向)顯示預覽,並且圖像看起來有些縮放。

我用它googled一下,找到了解決這個問題的許多方法,我嘗試了所有方法,但沒有人能解決我的問題。

我想我缺少一些主要概念,我無法弄清楚

在此處輸入圖片說明

CameraActivity.java

public class CameraActivity extends AppCompatActivity {
    private static final String TAG = "CameraActivity";
    private Camera mCamera;
    private CameraPreview mPreview;
    private PictureCallback mPictureCallback;
    private Context myContext;
    private FrameLayout cameraPreview;
    private boolean frontCamera = false, backCamera = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        initialize();
    }

    private void findViews() {
        cameraPreview = (FrameLayout) findViewById(R.id.camera_preview);
    }

    public void initialize() {
        findViews();
        myContext = this;
        mCamera = Camera.open(findBackFacingCamera());
        mPreview = new CameraPreview(myContext, mCamera);
        cameraPreview.addView(mPreview);
    }

    private int findFrontFacingCamera() {
        int cameraId = -1; // initialized with empty
        int numberOfCameras = Camera.getNumberOfCameras();
        CameraInfo cameraInfo = new CameraInfo();
        for (int i = 0; i < numberOfCameras; i++) {
            Camera.getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == CameraInfo.CAMERA_FACING_FRONT) {
                cameraId = i;
                frontCamera = true;
                break;
            }
        }
        return cameraId;
    }

    private int findBackFacingCamera() {
        int cameraId = -1; // initialized with empty
        int numberOfCameras = Camera.getNumberOfCameras();
        CameraInfo cameraInfo = new CameraInfo();
        for (int i = 0; i < numberOfCameras; i++) {
            Camera.getCameraInfo(i, cameraInfo);
            if (cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
                cameraId = i;
                backCamera = true;
                break;
            }
        }
        return cameraId;
    }

    @Override
    protected void onResume() {
        super.onResume();
        //mPictureCallback=getPi
        if (!hasCamera(myContext)) {
            Log.e(TAG, "Sorry, your phone does not have a camera!");
        }
        if (mCamera == null) {
            if (findFrontFacingCamera() == 1) {
                releaseCamera();
                chooseCamera();
            }
        }
    }

    private void chooseCamera() {
        // If currently front camera is opened,then switch to back camera
        if (frontCamera) {
            int cameraId = findBackFacingCamera();
            if (cameraId > 0) {
                // Open backfacing camera
                // Set picture callback
                // refresh the preview
                mCamera = Camera.open(cameraId);
                mPictureCallback = getPictureCallBack();
                mPreview.refreshCamera(mCamera);
            }
        } else {
            int cameraId = findFrontFacingCamera();
            if (cameraId > 0) {
                mCamera = Camera.open(cameraId);
                mPictureCallback = getPictureCallBack();
                mPreview.refreshCamera(mCamera);
            }
        }
    }

    private PictureCallback getPictureCallBack() {
        PictureCallback pictureCallback = new PictureCallback() {
            @Override
            public void onPictureTaken(byte[] data, Camera camera) {


                File pictureFile = getOutputMediaFile();
                if (pictureFile == null) {
                    return;
                }
                try {
                    FileOutputStream fos = new FileOutputStream(pictureFile);
                    fos.write(data);
                    fos.close();
                    Log.e(TAG, " picture saved at " + pictureFile.getName());
                } catch (Exception e) {
                    Log.e(TAG, " getPictureCallBack  " + e);
                }
                mPreview.refreshCamera(mCamera);
            }
        };
        return pictureCallback;
    }

    private File getOutputMediaFile() {
        // make a new storage directory inside sd card
        File mediaStorage = new File("/sdcard/", "Tootle Camera");

        // if Tootle Camera directory doesn't exist
        if (!mediaStorage.exists()) {
            if (!mediaStorage.mkdirs()) {
                return null;
            } else {
                mediaStorage.mkdirs();
            }
        }

        String timeStamp = new SimpleDateFormat("dd/MM/yyy_hh:mm:ss a").format(new Date());

        // make media file
        File mediaFile = new File(mediaStorage.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
        return mediaFile;
    }

    private void releaseCamera() {
        if (mCamera != null) {
            mCamera.release();
            mCamera = null;
        }
    }

    public boolean hasCamera(Context context) {
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        releaseCamera();
    }
}

CameraPreview.java

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

        private static final String TAG = "CameraPreview";
        private SurfaceHolder mHolder;
        private Camera mCamera;
        private boolean isPreviewRunning = false;

        public CameraPreview(Context context, Camera camera) {
            super(context);
            mCamera = camera;
            mHolder = getHolder();
            mHolder.addCallback(this);
        }


        @Override
        public void surfaceCreated(SurfaceHolder holder) {

            try {
                // create the surface and start camera previre
                if (mCamera == null) {
                    mCamera.setPreviewDisplay(mHolder);
                    mCamera.startPreview();

                }


            } catch (Exception e) {
                Log.e(TAG, " surfaceCreated " + e);
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            // If your preview can change or rotate, take care of those events here.
            // Make sure to stop the preview before resizing or reformatting it.
            //refreshCamera(mCamera);

            if (isPreviewRunning) {
                mCamera.stopPreview();
            }

            Camera.Parameters parameters = mCamera.getParameters();
            Display display = ((WindowManager) getContext().getSystemService(Context.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();

        }

        public void refreshCamera(Camera camera) {

            if (mHolder == null) {
                // preview surface does not exist
                return;
            }
            try {
                mCamera.stopPreview();
            } catch (Exception e) {
                Log.e(TAG, " refreshCamera " + e);
            }
            setCamera(camera);
            try {
                mCamera.setPreviewDisplay(mHolder);
                mCamera.startPreview();
            } catch (Exception e) {
                Log.e(TAG, " refreshCamera " + e);
            }
        }

        private void setCamera(Camera camera) {
            //method to set a camera instance
            mCamera = camera;
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            mCamera.release();
        }

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

CameraPreview.java中

setCamera(camera);
try {
      mCamera.setPreviewDisplay(mHolder); 

寫這個:

mCamera.setDisplayOrientation(90);
mCamera.startPreview();

如果您具有文件路徑和位圖,請使用以下方法檢查旋轉並進行修復:

  public Bitmap checkRotation(String filePath, Bitmap scaledBitmap) {
        ExifInterface exif;
        try {
            exif = new ExifInterface(filePath);

            int orientation = exif.getAttributeInt(
                    ExifInterface.TAG_ORIENTATION, 0);
            Log.d("EXIF", "Exif: " + orientation);
            Matrix matrix = new Matrix();
            if (orientation == 6) {
                matrix.postRotate(90);
                Log.d("EXIF", "Exif: " + orientation);
            } else if (orientation == 3) {
                matrix.postRotate(180);
                Log.d("EXIF", "Exif: " + orientation);
            } else if (orientation == 8) {
                matrix.postRotate(270);
                Log.d("EXIF", "Exif: " + orientation);
            }
            scaledBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0,
                    scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix,
                    true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return scaledBitmap;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM