简体   繁体   English

相机方向在Android中不正确

[英]Camera Orientation is not Proper in android

I am using custom camera and surface view for capturing image but the problem is the camera orientation is not proper, following is my code and sorry for my bad English communication. 我正在使用自定义相机和曲面视图来捕获图像,但问题是相机方向不正确,以下是我的代码,对于我的英语交流不佳感到抱歉。

public class Camera_Activity extends Activity implements
        SurfaceHolder.Callback {
    private Camera camera = null;
    private SurfaceView cameraSurfaceView = null;
    private SurfaceHolder cameraSurfaceHolder = null;
    private boolean previewing = false;

    private Display display = null;

    private static int wid = 0, hgt = 0;

    private LayoutInflater layoutInflater = null;
    private View cameraViewControl = null;
    private LayoutParams layoutParamsControl = null;

    private Button btnCapture = null;
    ImageView mImgView1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        display = getWindowManager().getDefaultDisplay();
        wid = display.getWidth();
        hgt = display.getHeight();

        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.camera);

        mImgView1 = (ImageView) findViewById(R.id.mImgView1);

        mImgView1.setImageResource(R.drawable.first_leg);

        cameraSurfaceView = (SurfaceView) findViewById(R.id.cameraSurfaceView);
        cameraSurfaceHolder = cameraSurfaceView.getHolder();
        cameraSurfaceHolder.addCallback(this);
        cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        layoutInflater = LayoutInflater.from(getBaseContext());
        layoutParamsControl = new LayoutParams(LayoutParams.FILL_PARENT,
                LayoutParams.FILL_PARENT);

        cameraViewControl = layoutInflater.inflate(R.layout.cambutton, null);
        this.addContentView(cameraViewControl, layoutParamsControl);

        cameraViewControl = layoutInflater.inflate(R.layout.vampireimage, null);
        this.addContentView(cameraViewControl, layoutParamsControl);

        btnCapture = (Button) findViewById(R.id.btnCapture);
        btnCapture.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                camera.takePicture(cameraShutterCallback,
                        cameraPictureCallbackRaw, cameraPictureCallbackJpeg);
            }
        });
    }

    ShutterCallback cameraShutterCallback = new ShutterCallback() {
        @Override
        public void onShutter() {
            // TODO Auto-generated method stub
            System.out.println("Hello Shutter");
        }
    };

    PictureCallback cameraPictureCallbackRaw = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            System.out.println("Hello Picture");
        }
    };

    PictureCallback cameraPictureCallbackJpeg = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            Bitmap cameraBitmap = BitmapFactory.decodeByteArray(data, 0,
                    data.length);

            wid = cameraBitmap.getWidth();
            hgt = cameraBitmap.getHeight();

            Bitmap newImage = Bitmap.createBitmap(wid, hgt,
                    Bitmap.Config.ARGB_8888);

            Canvas canvas = new Canvas(newImage);

            canvas.drawBitmap(cameraBitmap, 0f, 0f, null);

            Constants.mImageBitmap.clear();
            Constants.mImageBitmap.add(cameraBitmap);

            File storagePath = new File(
                    Environment.getExternalStorageDirectory() + "/Photos/");
            storagePath.mkdirs();

            File myImage = new File(storagePath, "1.jpg");

            try {
                FileOutputStream out = new FileOutputStream(myImage);
                newImage.compress(Bitmap.CompressFormat.JPEG, 80, out);
                out.flush();
                out.close();
            } catch (FileNotFoundException e) {
                Log.d("In Saving File", e + "");
            } catch (IOException e) {
                Log.d("In Saving File", e + "");
            }

            camera.startPreview();

            newImage.recycle();
            newImage = null;

            // cameraBitmap.recycle();
            // cameraBitmap = null;

            Intent mInPreview = new Intent(Camera_Activity.this,
                    Preview_Activity.class);
            mInPreview.putExtra("Value", "First");
            startActivity(mInPreview);
            finish();
        }
    };

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        if (previewing) {
            camera.stopPreview();
            previewing = false;
            System.out.println("Hello 2");
        }
        try {
            Camera.Parameters parameters = camera.getParameters();
            Display display = ((WindowManager) getSystemService(WINDOW_SERVICE))
                    .getDefaultDisplay();

            if (display.getRotation() == Surface.ROTATION_0) {
                parameters.setPreviewSize(height, width);
                camera.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);
                camera.setDisplayOrientation(180);
            }
            camera.setParameters(parameters);

            camera.setPreviewDisplay(cameraSurfaceHolder);
            camera.startPreview();
            previewing = true;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        try {
            camera = Camera.open();
        } catch (RuntimeException e) {
            Toast.makeText(
                    getApplicationContext(),
                    "Device camera is not working properly, please try after sometime.",
                    Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        System.out.println("Hello 3");
        camera.stopPreview();
        camera.release();
        camera = null;
        previewing = false;
    }

    @Override
    public void onBackPressed() {
        // TODO Auto-generated method stub
        super.onBackPressed();
        AlertDialog.Builder alert = new AlertDialog.Builder(this);
        alert.setTitle("3DSoles");
        alert.setMessage("Do U Want to Exit?");
        alert.setNegativeButton("No", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub

            }
        });

        alert.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                finish();
            }
        });
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.setTitle("3DSoles");
            alert.setMessage("Do U Want to Exit?");
            alert.setNegativeButton("No",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub

                        }
                    });

            alert.setPositiveButton("Yes",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // TODO Auto-generated method stub
                            finish();
                        }
                    });
        }
        return super.onKeyDown(keyCode, event);
    }
}
  1. Camera class is not expected to support setPreview(height, width) Camera类不应支持setPreview(height, width)

  2. see http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation%28int%29 for the official way to choose Camera.setDisplayOrientation() 有关选择Camera.setDisplayOrientation()的官方方法,请参见http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation%28int%29

  3. Starting from API 14 (ICS and higher), camera is expected to support setDisplayOrientation() without interrupting preview. 从API 14(ICS和更高版本)开始,相机应支持setDisplayOrientation()而不会中断预览。

  4. For older platforms, I would recommend to disable change of orientation while the camera preview is active; 对于较旧的平台,建议您在启用相机预览时禁用方向更改; reset of camera ( stopPreview() + startPreview ) may take too long for UX to be freiendly. 重置相机( stopPreview() + startPreview )可能需要很长时间才能使UX处于友好状态。 Often, preview activities either work with fixed orientation or "simulate" in software orientation change in response to accelerometer events. 通常,预览活动要么以固定方向运行,要么响应于加速度计事件而“模拟”软件方向更改。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM