Во время захвата изображения камера зависает в Redmi Note7 с камерой2 API Android - PullRequest
0 голосов
/ 08 ноября 2019

В приведенном ниже коде я только что прочитал изображение и сохранил его в галлерею.

            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();
                    }
                }

приватное сохранение void (байт [] байт) создает 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());

// finalint вращение = getImageOrientation (file.getAbsolutePath ());

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

1 Ответ

0 голосов
/ 11 ноября 2019

Я предполагаю, что вы закрываете свое изображение до завершения каждой операции. Сначала получите ваше изображение как:

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 дляконтролировать мой поток.

...