1.Camera 2 的架构图:
camera2架构图
Camera2引用了管道的概念将安卓设备和摄像头之间联通起来,系统向摄像头发送Capture请求,而摄像头会返回CameraMetada。这一切都建立在CameraCaptureSession的会话中。
2.camera2拍照流程图:
camera2拍照流程图
3.具体实现步骤
3.1 申请权限 动态申请
Amdroidmanifest.xml文件中也需要输入以下代码
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
MainActivity.java 中
private static final String TAG = "预览";
private static final SparseIntArray ORIENTATION = new SparseIntArray();
static {
ORIENTATION.append(Surface.ROTATION_0,90);
ORIENTATION.append(Surface.ROTATION_90,0);
ORIENTATION.append(Surface.ROTATION_180,270);
ORIENTATION.append(Surface.ROTATION_270,180);
}
private String mCameraId; // 摄像头Id
private Size mPreviewSize; //获取分辨率
private ImageReader mImageReader; //图片阅读器
private CameraDevice mCameraDevice; //摄像头设备
private CameraCaptureSession mCaptureSession; //获取会话
private CaptureRequest mPreviewRequest; //获取请求
private CaptureRequest.Builder mPreviewRequestBuilder; //创建获取请求
private TextureView textureView; //预览视图
private Surface mPreviewSurface; //
private String[] permissions = {Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE };
private List<String> permissionList = new ArrayList();
// 第一步:获取权限
/**
* 获取拍照和读写权限
*/
private void getPermission() {
Log.i(TAG, " getPermission");
if (permissionList != null) {
permissionList.clear();
}
//版本判断 当手机系统大于23时,才有必要去判断权限是否获取
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//权限是否已经 授权 GRANTED-授权 DINIED-拒绝
for (String permission : permissions) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
permissionList.add(permission);
}
}
if (!permissionList.isEmpty()) {
ActivityCompat.requestPermissions(this, permissionList.toArray(new String[permissionList.size()]), 1000);
} else {
//表示全都授权了
textureView.setSurfaceTextureListener(textureListener);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] mPermissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1000) {
//权限请求失败
if (grantResults.length > 0) {
//存放没授权的权限
List<String> deniedPermissions = new ArrayList<>();
for (int i = 0; i < grantResults