我正在创建一个基本的相机应用程序,作为我开始着手Android开发的一个小项目。
当我单击按钮拍摄照片时,在大约1秒钟的延迟时间内,预览冻结,然后再次冻结。崩溃没有问题-只是冻结问题。为什么会发生这种情况,我该如何解决?
下面是实例化相机的方法以及我的SurfaceView类。
private void startCamera() {
this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
cameraPreviewLayout = (FrameLayout) findViewById(R.id.camera_preview);
camera = checkDeviceCamera();
camera.setDisplayOrientation(90);
mImageSurfaceView = new ImageSurfaceView(MainActivity.this, camera);
cameraPreviewLayout.addView(mImageSurfaceView);
ImageButton captureButton = (ImageButton)findViewById(R.id.imageButton);
captureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
camera.takePicture(null, null, pictureCallback);
camera.stopPreview();
camera.startPreview();
}
});
}
public class ImageSurfaceView extends SurfaceView implements
SurfaceHolder.Callback {
private Camera camera;
private SurfaceHolder surfaceHolder;
public ImageSurfaceView(Context context, Camera camera) {
super(context);
this.camera = camera;
this.surfaceHolder = getHolder();
this.surfaceHolder.addCallback(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
this.camera.setPreviewDisplay(holder);
this.camera.startPreview();
this.camera.setDisplayOrientation(90);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
编辑:当前pictureCallback中没有任何内容。
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
}
答案 0 :(得分:1)
您无需在stopPreview()
之后致电takePicture()
。而且您无需在下一行使用startPreview()
。如果您希望实时预览在之后重启,请do need startPreview()
放在onPictureTaken()
回调中(不在onClick()
中,如发布的代码中所示!)图片被捕获到Jpeg流中。
要在使用相机时保持UI响应,应在后台线程上使用相机进行所有操作。但是在 some 后台线程上调用Camera.open()
或Camera.close()
是不够的。您必须创建一个处理程序线程并将其用于Camera.open()
。相同的Looper将用于所有相机回调,包括PictureCallback.onPictureTaken()
。关于HandlerThread的使用,请参见我的detailed walkthrough。
与我explained elsewhere一样,如果您在完全支持该API的设备上使用新的camera2 API,则可以实现更高的性能(但最好将旧API与仅提供该API的设备一起使用相机2的LEGACY级别)。
但是,如果您想从摄像机ISP中获得最大收益,这种冻结可能是不可避免的(这取决于制造商做出的许多硬件和固件设计选择)。一些巧妙的UI调整可能有助于掩盖这种效果。
答案 1 :(得分:0)
您需要启用对隐藏的“开发人员选项”菜单的访问权限 您的Android手机。为此,只需点击“关于手机”中的 设定然后点击“内部版本号”七次,完成。现在轮到你 可以返回到“设置”主菜单,您会发现开发人员 选项位于列表底部附近。
==>现在您已经完成了这一部分,让真正的乐趣开始了。点击刚刚启用的新开发者选项菜单,然后滚动直到 请参阅以下三个设置(请注意,它们可能位于 “高级”小节):
窗口动画比例过渡动画比例Animator动画 规模
==>您看到了吗?默认情况下,这三个选项均设置为“ 1x”,但是点击它们并将其更改为“ .5x”将大大降低 加快手机速度。这种无害的调整迫使设备加速 所有过渡动画,整个用户体验更快 结果更流畅