在 Redmi Note7 的相机 2 中拍摄图像时相机冻结 API Android

While capturing image camera gets freeze in Redmi Note7 s camera2 API Android

在下面的代码中,我刚刚读取图像并将其保存到图库中。

            public void onImageAvailable(ImageReader reader) {
                Image image = null;
                try {
                    image = reader.acquireLatestImage();
                    buffer = image.getPlanes()[0].getBuffer();
                    bytes = new byte[buffer.capacity()];
                    buffer.get(bytes);
                    save(bytes);

                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                } finally {
                    if (image != null) {
                        image.close();
                    }
                }

private void save(byte[] bytes) 抛出 IOException {

                if (!myDir.exists()) {
                    myDir.mkdirs();
                }

                Random generator = new Random();
                int n = 10000;
                n = generator.nextInt(n);
                String fname = "Image-" + n + ".png";

                File file = new File(myDir, fname);

                if (file.exists()) file.delete();



                OutputStream output = null;
                try {
                    output = new FileOutputStream(file);
                    output.write(bytes);
                    scanFile(file.getAbsolutePath());

// final int rotation = getImageOrientation(file.getAbsolutePath());

                } finally {
                    if (null != output) {
                        output.close();
                    }
                }
            }

我的猜测是,您在每次操作完成之前关闭了图像。首先让你的形象像:

private ImageReader mImageReader;
private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new
        ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {

                if(count==0) {
                    mBackgroundHandler.post(new ImageSaver(reader.acquireLatestImage()));
                    ++count;
                }
            }
        };

之后你可以在一个单独的线程中做你想做的事情,比如:

private class ImageSaver implements Runnable {

    private final Image mImage;

    public ImageSaver(Image image) {
        mImage = image;
    }

    @Override
    public void run() {


        //Do what you want to do here and close your Image after that. Code here!!

        mImage.close();
        --count;
    }
}

我使用 int ++count --count 来控制我的流量。