您的位置:首页 > 移动开发 > Android开发

Android中使用Camera

2015-07-09 17:56 591 查看
1.使用surfaceView来预览。

2.调用Camera来设置相机。

3.设置camera的参数。

看下面的例子:

//设置surfaceView不需要自己维护缓冲区
    surfaceView_image_show.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    //获取surfaceView的SurfaceHolder
    surfaceHolder = surfaceView_image_show.getHolder();
    //为surfaceHolder添加一个回调监听器
    surfaceHolder.addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            initCamera();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            //如果camera不为空,释放摄像头
            if(camera != null){
                if(isPreview){
                    camera.stopPreview();
                }
                camera.release();
                camera = null;
            }
        }
    });
}
//初始化摄像头
private void initCamera(){
    //如果没有预览
    if(!isPreview){
        camera = Camera.open(0);//打开后置摄像头
        camera.setDisplayOrientation(90);
    }
    if(camera != null && !isPreview){
        //设置Camera的参数
        Camera.Parameters parameters = camera.getParameters();
        parameters.setPreviewSize(screenWidth,screenHeight);//设置预览照片大小
        parameters.setPreviewFpsRange(4, 10);//预览照片每秒显示多少帧的最小值和最大值
        parameters.setPreviewFormat(ImageFormat.JPEG);//设置图片格式
        parameters.set("jpeg-quality", 85);//设置JPG照片的质量
        parameters.setPictureSize(screenWidth, screenHeight);//设置图片大小
        try {
            camera.setPreviewDisplay(surfaceHolder);//通过SurfaceView显示取景画面
        } catch (IOException e) {
            e.printStackTrace();
        }
        camera.startPreview();//开始预览
        isPreview = true;
    }

}
//控制摄像头自动对焦
public void capture(View view){
    if(camera != null){
        //控制摄像头自动对焦后才拍照
        camera.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                if(!success){
                    camera.takePicture(new Camera.ShutterCallback() {
                        @Override
                        public void onShutter() {
                            //按下快门会执行此处代码
                        }
                    }, new Camera.PictureCallback() {
                        @Override
                        public void onPictureTaken(byte[] data, Camera camera) {
                            //此处代码可以决定是否需要保存原始照片信息
                        }
                    }, new Camera.PictureCallback() {
                        @Override
                        public void onPictureTaken(byte[] data, Camera camera) {
                            //根据拍照所取得的数据创建位图
                            final Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);
                            View view =  getLayoutInflater().inflate(R.layout.save_camera_img, null);
                            ImageView camera_img = (ImageView)view.findViewById(R.id.ImageView_camera_showimg);
                            camera_img.setImageBitmap(bm);
                            AlertDialog.Builder dialog = new AlertDialog.Builder(CameraActivity.this)
                                    .setView(view)
                                    .setNegativeButton("取消", null)
                                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                            //跳转到图片编辑界面,并将该Bitmap对象传过去

                                            File file = new File(Environment.getExternalStorageDirectory(),
                                                    UUID.randomUUID().toString()+".jpg");
                                            try {
                                                FileOutputStream fos = new FileOutputStream(file);
                                                bm.compress(Bitmap.CompressFormat.JPEG,100,fos);
                                                fos.close();

                                            } catch (FileNotFoundException e) {
                                                e.printStackTrace();
                                            } catch (IOException e) {
                                                e.printStackTrace();
                                            }
                                            Intent intent = new Intent(CameraActivity.this, EditCameraImgActivity.class);
                                            intent.putExtra("cameraImgPath",file.getAbsolutePath());
                                            CameraActivity.this.startActivity(intent);
                                            CameraActivity.this.finish();
                                        }
                                    });
                            dialog.create().show();
                            camera.stopPreview();
                            camera.startPreview();
                            isPreview  = true;
                        }
                    });
                }
            }
        });
    }
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: