在前面我们已经介绍过,使用Camera2框架和TextureView,来预览视频、拍摄照片
但很多旧项目和代码,使用的还是旧的Camera框架
这里我们介绍下Camera框架用法,这次我们改用SurfaceView
总代码量很少,不到100行,其中有些是封装好的工具类,但视频部分代码都是原生代码,并不影响
@SuppressWarnings("all")
public class LoginActivity extends CommonActivity {
@BindView(R.id.v_surface_view)
SurfaceView surfaceView;
@BindView(R.id.bt1)
View bt1;
@BindView(R.id.bt2)
View bt2;
Camera camera;
Data timer = Data.create(Times.millisOfNow());
protected void create() {
setContentView(R.layout.activity_main);
ButterKnife.bind(this, ctx);
requestAllPermissionWithCallback();
}
@Override
protected void onPermissionOk() {
//SurfaceView创建完毕时,打开摄像头
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
openCamera();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
});
//拍照
bt1.setOnClickListener(v -> {
takePhoto();
});
}
@SneakyThrows
private void openCamera() {
camera = Cameras.openBackCamera();
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(640, 480);
parameters.setPictureSize(640, 480);
parameters.setPreviewFrameRate(30);
parameters.setPreviewFormat(PixelFormat.YCbCr_420_SP);
parameters.setPictureFormat(PixelFormat.JPEG);
camera.setParameters(parameters);
camera.setPreviewDisplay(surfaceView.getHolder());
camera.setPreviewCallback((data, camera) -> {
System.out.println("Frame Got");
});
camera.startPreview();
}
@SneakyThrows
private void takePhoto() {
Tasks.executeWithIntervalLimit(() -> {
camera.autoFocus((success, cam1) -> {
camera.takePicture(null, null, (data, cam2) -> {
String path = Files.getAndroidExternalPath("cam.jpg", false);
Files.writeToFile(path, data);
TipBox.tip("照片已保存");
camera.startPreview();
});
});
}, timer, 3000, () -> {
TipBox.tip("拍摄频率太快");
});
}
}