Camera

Google封装类CameraView的使用

2018-09-21  本文已影响794人  你饿不饿呀

前言

对于拍照功能来说,Android 由于版本不同可以使用不同的书写方式,光API就有Camera和Camera2两套,其余的区别还有

API Level Camera API Preview View
9-13 Camera1 SurfaceView
14-20 Camera1 TextureView
21-23 Camera2 TextureView
24及以上 Camera2 SurfaceView

虽然Android能够向下兼容,但是谁不想使用更新的API和技术,另一方面,Camera API调用起来也不方便,所以对Camera调用的封装势在必行。

github上面有一些,但是使用时经常出现兼容性,适配等问题,直到发现了Google自己封装的CameraView,地址:
https://github.com/google/cameraview

导入

这里Google没有上传到仓库,所以我们需要自己导入。

首先去Github页面下载源代码


image.png

把下载的文件里的解压出来,随便放到什么位置


image.png

然后进入Android Studio 选择 Import Module


image.png

选择你刚才解压出来的library(这里我已经改名为cameraView)


image.png

接下来可能会提示错误,需要修改library的build.gradle


image.png

配置文件的sdkversion为你的sdkversion,还有一些test相关的可以删除。

之后再编译一次就可以使用了。

使用

直接上代码,没什么难点。

public class CameraActivity extends SwipeBackActivity {

    @BindView(R.id.camera_cameraView)
    CameraView cameraView;
    @BindView(R.id.camera_flash)
    ImageView imageView;


    @OnClick({R.id.camera_album,R.id.camera_flash,R.id.camera_paizhao})
    void onClick(View view){
        switch(view.getId()){
            case R.id.camera_album:{
                //打开相册选择图片
                ImageUtil.openMatisse(this);
                break;
            }
            case R.id.camera_flash:{
                int stats = cameraView.getFlash();
                if(stats == CameraView.FLASH_TORCH) {//关闭闪光灯
                    cameraView.setFlash(CameraView.FLASH_OFF);
                    imageView.setImageResource(R.mipmap.flash);
                }
                else {//开启闪光灯
                    cameraView.setFlash(CameraView.FLASH_TORCH);
                    imageView.setImageResource(R.mipmap.flash_on);
                }
                break;
            }
            case R.id.camera_paizhao:{
                cameraView.takePicture();//拍照
                break;
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BarUtils.setStatusBarAlpha(this);
        setContentView(R.layout.activity_camera);
        ButterKnife.bind(this);
        cameraView.addCallback(new CameraView.Callback() {
            @Override
            public void onCameraOpened(CameraView cameraView) {
                super.onCameraOpened(cameraView);
                cameraView.setAspectRatio(AspectRatio.of(1920,1080));//设置图片尺寸
                cameraView.setAutoFocus(true);//自动对焦
            }

            @Override
            public void onCameraClosed(CameraView cameraView) {
                super.onCameraClosed(cameraView);
            }

            @Override
            public void onPictureTaken(CameraView cameraView, byte[] data) {//在这里保存拍到的图片
                super.onPictureTaken(cameraView, data);
                String filePath = Util.getWrongFile()+"/"+new Date().getTime()+".jpg";
                boolean isSuccess = FileIOUtils.writeFileFromBytesByStream(filePath,data);
                if(isSuccess){
                    setResult(1,new Intent().putExtra("data",filePath));
                }else {
                    setResult(0);
                }
                finish();
            }
        });
    }


    @Override
    protected void onResume() {
        super.onResume();
        cameraView.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        cameraView.stop();
    }

    @Override
    protected void onStop() {
        super.onStop();
        cameraView.stop();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读