【问题标题】:Android Camera disable stopPreview on takePictureAndroid相机在takePicture上禁用stopPreview
【发布时间】:2017-09-28 13:16:56
【问题描述】:

我正在尝试构建一个应用程序,该应用程序使用相机 API 每秒拍摄一张照片,持续 10 秒。 我按照此链接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) 拍照后,预览显示将停止。要拍摄更多照片,请先再次调用 startPreview()。

有没有办法禁用 stopPreview,或者此方法在拍照时会执行的任何其他操作?

感谢您的帮助。

【问题讨论】:

标签: java android android-camera


【解决方案1】:

也许对你来说 onPreviewFrame() 提供的分辨率就足够了?那么,'拍照'后就不需要重启相机了。实时预览不会冻结。

如果您以 API >= 21 (Lollipop) 的设备为目标,则应使用新的 camera2 API 而不是已弃用 Camera API。新 API 有许多改进,其中包括 - 它可以帮助平滑多图像捕获。

即使您被旧的 API 卡住了,也需要进行一些改进。

现有代码的一个问题是它可以在 UI 线程上与相机设备一起使用。相反,use a background HandlerThread 打开相机,并确保onPictureTaken() 重新启动预览并立即返回,将所有处理卸载到另一个工作线程。

【讨论】:

  • 我选择直接在onPreviewFrame()中抓图。它适用于对输入数据的一些处理
猜你喜欢
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多