Не удается сохранить захваченное изображение в папке с помощью пользовательской камеры в android - PullRequest
0 голосов
/ 11 марта 2020

У меня есть простое приложение с пользовательской камерой , но когда я делаю снимок, я не могу сохранить захваченное изображение внутри Загрузки папку в эмуляторе, вместо пустой папки создано, я не знаю, почему и где ошибка в моем коде. Я искал ответы, но не нашел полезного.

Можете ли вы помочь, пожалуйста?

Читатель изображения

final ImageReader reader = ImageReader.newInstance(width, height, ImageFormat.JPEG, 1);
            List<Surface> outputSurface = new ArrayList<>();
            outputSurface.add(reader.getSurface());
            outputSurface.add(new Surface(textureView.getSurfaceTexture()));
            final CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
            builder.addTarget(reader.getSurface());
            builder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
            int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
            builder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
            final ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
                @Override
                public void onImageAvailable(ImageReader imageReader) {
                    Image mCapturedImage;
                    mCapturedImage = imageReader.acquireLatestImage();
                    mFile = getActivity().getExternalFilesDir(null);
                    ImageSaver saver = new ImageSaver(mCapturedImage,getActivity().getExternalFilesDir(null));
                    mBackgroundHandler.post(saver);
                }

            };
            reader.setOnImageAvailableListener(readerListener, mBackgroundHandler);
            final CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() {
                @Override
                public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
                    super.onCaptureCompleted(session, request, result);
                    showSnackBar("Image saved", Snackbar.LENGTH_LONG);
                    createCameraPreview();
                }
            };

Класс ImageSaver

 private static class ImageSaver implements Runnable {

        private final File mFile;
        private Image mImage;

        ImageSaver(Image image, File file) {
            mImage = image;
            mFile = file;
        }

        @Override
        public void run() {

            if (mImage != null) {
                ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
                byte[] bytes = new byte[buffer.remaining()];
                buffer.get(bytes);
                FileOutputStream output = null;
                try {
                    SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
                    String format = s.format(new Date());
                    String fileName = format+".jpg";
                    File file = new File(mFile, "image_" + fileName);
                    output = new FileOutputStream(file);
                    output.write(bytes);
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (null != output) {
                        try {
                            output.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

1 Ответ

1 голос
/ 11 марта 2020

Ваш код работает правильно, поэтому сохраните файл изображения на устройстве, но он сохранит его в результате пути, возвращенного здесь:

mFile = getActivity().getExternalFilesDir(null); 

Возможно, указывает внешний файл dir в myapp / data / data, которая является областью данных «песочницы», зарезервированной для файлов, которые ваше приложение записывает во внешнее хранилище. Это не то же самое, что папка «Загрузки», в которой файлы сохраняются в общей области данных (вне песочницы) на телефоне.

Если вы хотите сохранить в папке «Загрузки», вам, вероятно, придется запишите свои изображения на внешний веб-сайт, затем передайте путь https: // к ViewIntent, который будет отображать ваше изображение в сеансе браузера, и дайте вам возможность загрузить изображение оттуда.

В вашем коде , у вас есть:

mFile = getActivity().getExternalFilesDir(null);

Но я не вижу, где mFile объявлен в Image Reader. В другом классе вы определяете его как файл. если mFile - это файл, то вы, вероятно, должны делать что-то вроде:

String mPath = getActivity().getExternalFilesDir(null);
File mFile = new File(mPath + "/temp.jpg");

// but I don't think you need to create a file, just use the path
ImageSaver saver = new ImageSaver(mCapturedImage,mPath);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...