Android 摄像头系统调用

一个简单的demo演示摄像头的用法

直接启动摄像头

使用权限

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

在Activity中以接收回传值的方式处理拍照的图片


public class CameraActivity extends AppCompatActivity {

    private File mFileName;
    private Button mBtnStart;
    private ImageView mIvImg;
    private Button mBtnPreview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        initView();
        mBtnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                File path = new File(Environment.getExternalStorageDirectory(), "test");
                if (!path.exists()) {
                    path.mkdirs();
                }
                mFileName = new File(path, System.currentTimeMillis() + ".jpg");
                if (!mFileName.exists()) {
                    try {
                        mFileName.createNewFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                // 启动系统的Camera
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                // 将系统的的拍摄结果写入文件
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mFileName));
                // 打开摄像头
                startActivityForResult(intent, Activity.DEFAULT_KEYS_DIALER);
            }
        });
        mBtnPreview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(CameraActivity.this, PickActivity.class);
                startActivity(intent);

            }
        });
    }

    private void initView() {
        mBtnStart = (Button) findViewById(R.id.id_btn_start);
        mBtnPreview = (Button) findViewById(R.id.id_btn_preview);
        mIvImg = (ImageView) findViewById(R.id.id_iv_img);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // 显示图片
        if (requestCode == Activity.DEFAULT_KEYS_DIALER) {
            mIvImg.setImageURI(Uri.fromFile(mFileName));
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
}

此处就是通过将摄像头拍照的图片保存在文件中,文件的路径通过Intent和Uri传递
这里写图片描述

使用SufaceView 实现拍照预览,手动实现拍照功能


public class PickActivity extends AppCompatActivity {

    private Button mBtnPick;
    private SurfaceView mSvView;

    private SurfaceHolder.Callback mCallback;
    private Camera mCamera;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pick);
        initView();
        mCallback = new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                startCamera();
            }

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

            }

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                stopCamera();
            }
        };
        mSvView.getHolder().addCallback(mCallback);
        mBtnPick.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCamera.takePicture(null, null, new Camera.PictureCallback() {
                    @Override
                    public void onPictureTaken(byte[] data, Camera camera) {
                        File path = new File(Environment.getExternalStorageDirectory(), "test");
                        if (!path.exists()) {
                            path.mkdirs();
                        }
                        File fileName = new File(path, "test.jpg");
                        try {
                            FileOutputStream fos = new FileOutputStream(fileName);
                            fos.write(data);
                            fos.flush();
                            fos.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        });
    }

    private void stopCamera() {
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    private void startCamera() {
        mCamera = Camera.open();
        try {
            mCamera.setPreviewDisplay(mSvView.getHolder());
            mCamera.setDisplayOrientation(90);
            mCamera.startPreview();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void initView() {
        mBtnPick = (Button) findViewById(R.id.id_btn_pick);
        mSvView = (SurfaceView) findViewById(R.id.id_sv_camera);
    }
}

* 在SurfaceView 的onCreate 和 onDestory 回调方法中分别实现摄像头的打开和关闭,点击Btn时,调用takePicture将摄像头捕获的数据写入文件。*
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值