Android 相机在 takePicture 上禁用 stopPreview
Android Camera disable stopPreview on takePicture
我正在尝试构建一个使用相机 API 每秒拍摄一张照片的应用程序,持续 10 秒。
我遵循了本 link Android Camera API 中的教程并修改了代码以获取我的图片列表(请参阅下面的代码)。一切都很完美...
现在,问题是(我想)takePicture 方法因为它停止了预览,我需要在回调 onPictureTaken 导致屏幕冻结.
private void initializeCamera() {
// Create an instance of Camera
mCamera = getCameraInstance();
// Create our Preview view and set it as the content of our activity.
CameraPreview mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = findViewById(R.id.camera_preview);
preview.addView(mPreview);
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
startRecognition();
}
});
}
private PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
mCamera.startPreview(); // <----- Restart preview.. stop freeze
// Task to detect an object in the picture.. Do something
}
};
public void startRecognition() {
if (SystemClock.elapsedRealtime() - startedTime > 10000) {
// Detection has failed.. Do something
}
else {
// Get a frame each second
if (SystemClock.elapsedRealtime() - elapsedTime > 1000) {
elapsedTime = SystemClock.elapsedRealtime();
mCamera.takePicture(null, null, mPicture); // <---- Take picture but stop preview
}
}
}
来自 Android 相机文档:
8) After taking a picture, preview display will have stopped. To take more photos, call startPreview() again first.
有没有办法禁用停止预览,或者这个方法做的任何其他事情,当我拍照时?
感谢您的帮助。
也许对您来说,onPreviewFrame() 中提供的分辨率就足够了?那么,'taking a picture'之后就不需要重启相机了。实时预览不会卡顿。
如果您的目标设备 API >= 21 (Lollipop),您应该使用新的 camera2 API instead of the deprecated Camera API。新的 API 有许多改进,其中包括 - 它可以帮助流畅地捕获多图像。
即使您仍然使用旧的 API,也有一些改进可以做。
您现有代码的一个问题是它在 UI 线程上与相机设备一起工作。相反,use a background HandlerThread 打开相机,并确保 onPictureTaken()
重新启动预览和 returns 立即,将所有处理卸载到另一个工作线程。
我正在尝试构建一个使用相机 API 每秒拍摄一张照片的应用程序,持续 10 秒。 我遵循了本 link Android Camera API 中的教程并修改了代码以获取我的图片列表(请参阅下面的代码)。一切都很完美...
现在,问题是(我想)takePicture 方法因为它停止了预览,我需要在回调 onPictureTaken 导致屏幕冻结.
private void initializeCamera() {
// Create an instance of Camera
mCamera = getCameraInstance();
// Create our Preview view and set it as the content of our activity.
CameraPreview mPreview = new CameraPreview(this, mCamera);
FrameLayout preview = findViewById(R.id.camera_preview);
preview.addView(mPreview);
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] bytes, Camera camera) {
startRecognition();
}
});
}
private PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
mCamera.startPreview(); // <----- Restart preview.. stop freeze
// Task to detect an object in the picture.. Do something
}
};
public void startRecognition() {
if (SystemClock.elapsedRealtime() - startedTime > 10000) {
// Detection has failed.. Do something
}
else {
// Get a frame each second
if (SystemClock.elapsedRealtime() - elapsedTime > 1000) {
elapsedTime = SystemClock.elapsedRealtime();
mCamera.takePicture(null, null, mPicture); // <---- Take picture but stop preview
}
}
}
来自 Android 相机文档:
8) After taking a picture, preview display will have stopped. To take more photos, call startPreview() again first.
有没有办法禁用停止预览,或者这个方法做的任何其他事情,当我拍照时?
感谢您的帮助。
也许对您来说,onPreviewFrame() 中提供的分辨率就足够了?那么,'taking a picture'之后就不需要重启相机了。实时预览不会卡顿。
如果您的目标设备 API >= 21 (Lollipop),您应该使用新的 camera2 API instead of the deprecated Camera API。新的 API 有许多改进,其中包括 - 它可以帮助流畅地捕获多图像。
即使您仍然使用旧的 API,也有一些改进可以做。
您现有代码的一个问题是它在 UI 线程上与相机设备一起工作。相反,use a background HandlerThread 打开相机,并确保 onPictureTaken()
重新启动预览和 returns 立即,将所有处理卸载到另一个工作线程。