Android自定义相机

Android自定义相机Camera+SurfaceView

<1>界面使用SurfaceView控件,显示照相机的画面
<2>SurfaceView接受摄像头界面变化的信息
surfaceView.getHolder().addCallback()
<3>重写三个方法
surfaceDestroyed—>当预览界面关闭时,触发
一般在这里执行销毁照相机的操作,释放内存
camera.stopPreview();
camera.release();
camera = null;
surfaceCreated—–>预览界面被创建时,调用
一般在这里打开照相机和设置照相机的一些参数

        // 打开摄像头
        camera = Camera.open();

        // 给摄像头设置参数
        Parameters parameters = camera.getParameters();
        // 设置每秒3栈
        parameters.setPreviewFrameRate(3);
        // 设置照片的输出格式
        parameters.setPictureFormat(PixelFormat.JPEG);
        // 设置照片的质量
        parameters.set("jpeg-quality", 85);
        // 给照相机设置参数
        camera.setParameters(parameters);
        //将摄像头的画面显示到SurfaceView控件上
        camera.setPreviewDisplay(sv_main_camera.getHolder());
        // 开始预览
        camera.startPreview();
    surfaceChanged----->当预览界面的格式和大小发生改变时,触发
<4>保存
    camera.takePicture
    将照片保存到内存卡(压缩)

还是老规矩先看效果图:
这里写图片描述

摄像头是手机硬件部分,所以要加权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

下面看代码:

public class CameraActivity extends AppCompatActivity {

    private SurfaceView sv_camera_surfaceview;
    private Camera camera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
        //获取SurfaceView
        sv_camera_surfaceview = (SurfaceView) findViewById(R.id.sv_camera_surfaceview);
        sv_camera_surfaceview.getHolder().addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                //打开摄像头
                camera = Camera.open();
                //设置相机参数
                Camera.Parameters parameters=camera.getParameters();
                parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式
                parameters.set("jpeg-quality",85);// 设置照片的质量
                camera.setParameters(parameters);// 给照相机设置参数
                mySetDisplayOrientation(CameraActivity.this,0);
                //讲摄像头的画面展示到SurfaceView
                try {
                    camera.setPreviewDisplay(sv_camera_surfaceview.getHolder());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //开启预览
                camera.startPreview();
            }

            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {

            }
        });

    }

    //拍照的方法
    public void getImage(View view){
        camera.takePicture(null, null, new Camera.PictureCallback() {
            @Override
            public void onPictureTaken(byte[] bytes, Camera camera) {
                Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                //将字节数组转成图片
                try {
                    String sdPath= Environment.getExternalStorageDirectory().getAbsolutePath();
                    FileOutputStream fos=new FileOutputStream(sdPath+"/taoge"+System.currentTimeMillis()+".png");
                    Log.i("test",sdPath);
                    bitmap.compress(Bitmap.CompressFormat.PNG,85,fos);
                    camera.stopPreview();
                    camera.startPreview();
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }

            }
        });

    }

    private void mySetDisplayOrientation(Activity activity, int cameraId) { // 调整摄像头方向
        Camera.CameraInfo info = new Camera.CameraInfo();
        Camera.getCameraInfo(cameraId, info);
        int rotation = activity.getWindowManager().getDefaultDisplay()
                .getRotation();
        int degrees = 0;

        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 (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360; // compensate the mirror
        } else {
            // back-facing
            result = (info.orientation - degrees + 360) % 360;
        }
        camera.setDisplayOrientation(result);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //当界面关闭时,关闭相机
        camera.stopPreview();
        camera.release();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值