在学习这个模块之前必须要对android有关于相机拍照的API有所了解 , 这个模块的API有两部分 一部分就是Camera 还有一部分 是Camera2 好像androidX包里面还有一个CameraX , 但是 我们只能从最简单的来 就看android Camera包吧 我们线了解了解它的结构
由于API较多 我们这里就不做多的介绍 可以查看官网 :android.hardware | Android Developershttps://developer.android.google.cn/reference/android/hardware/package-summary
开发步骤:
- 首先 , 需要获取 相机对象实例 , 可以通过官网提供的open方法获取
- 还需要一个预览视图的容器(我的理解)术语来说就是需要一个表面 Sufarce
- 可以通过 相机对象 的 setPreviewDisplay方法来设置视图显示 该方法需要一个参数 就是Sufarceholder 对象
- 通过sufarce对象获取Sufarceholder 并设置Sufarceholder;
- 可以设置一下相机的参数 可以通过Camera.Parament这个类来设置
- 调用startPreView方法开启预览
- 在预览的状态下 调用TakePicture方法来实时拍照并获取拍照的图片 ;
代码:
开启预览和参数配置
SurfaceView surface = (SurfaceView) findViewById(R.id.sf); //获取视频承载对象
SurfaceHolder holder = surface.getHolder();//通过这个承载对象获取holder
camera = Camera.open();//使用Carmera类的open方法调用摄像头 这个方法会返回一个camera对象
camera.setDisplayOrientation(90);
//设置相机的参数
Camera.Parameters parameters = camera.getParameters();
//设置相机信息
parameters.setPictureSize(400 , 400);//设置该相机拍摄的照片的大小
parameters.setPictureFormat(ImageFormat.JPEG);//设置相机拍照的格式
//开始预览
startPreview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判断相机对象是否被实例化
if (camera!=null){
try {
camera.setPreviewDisplay(holder);//设置实时预览 --- 预览显示
camera.startPreview();//开启预览
isPreview = true ;
} catch (IOException e) {
e.printStackTrace();
}
}else {
new IllegalArgumentException("相机为打开");
}
}
});
开始拍照
//设置拍照按钮的监听事件
startTakePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (camera == null || isPreview == false){
Log.e("TAG", "相机没打开 或者是 未开启预览 " );
}else {
//开始拍照
parameters.setRotation(90);
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
//创建位图
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
//为imageView控件添加图片
image.setImageBitmap(bitmap);
//继续回到预览状态
camera.startPreview();
isPreview = true;
}
});
}
}
});