首页 > 解决方案 > 试图将图像保存到目录,保存到一个未知的地方

问题描述

我正在尝试为我的论文创建一个面部/情绪检测应用程序,但遇到了阻碍我前进的障碍,我无法弄清楚它阻止图像保存到手机目录的原因。它似乎正在保存到 SD 卡,但我没有在手机中使用 SD 卡/模拟 DCIM。

file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)+ "/" + UUID.randomUUID(), toString()+ ".jpg");
            ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
                @Override
                public void onImageAvailable(ImageReader imageReader) {
                    Image image = null;
                    try {
                    image = reader.acquireLatestImage();
                        ByteBuffer buffer = image.getPlanes() [0].getBuffer();
                        byte[] bytes = new byte[buffer.capacity()];
                        buffer.get(bytes);
                        save(bytes);
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                    finally {
                        {
                            if (image != null)
                                image.close();
                        }
                    }
                }

这是我必须创建文件并保存到该位置的代码,我尝试了其他解决方案,但它们会抛出错误。

File folder = new File(Environment.getExternalStorageDirectory() + "/CustomFolder");
            File file;
            if (!folder.exists()) {
                boolean success = folder.mkdir();
                if (success){
                    file = new File(folder.getPath() + "/" + UUID.randomUUID(), toString()+ ".jpg");
                }else {
                    Toast.makeText(FacialDetection.this, "Failed to save file to folder", Toast.LENGTH_SHORT).show();
                }
            }else{
                file = new File(folder.getPath() + "/" + UUID.randomUUID(), toString()+ ".jpg");
            }

            ImageReader.OnImageAvailableListener readerListener = new ImageReader.OnImageAvailableListener() {
                @Override
                public void onImageAvailable(ImageReader imageReader) {
                    Image image = null;
                    try {
                    image = reader.acquireLatestImage();
                        ByteBuffer buffer = image.getPlanes() [0].getBuffer();
                        byte[] bytes = new byte[buffer.capacity()];
                        buffer.get(bytes);
                        save(bytes);
                    } catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                    finally {
                        {
                            if (image != null)
                                image.close();
                        }
                    }
                }

                private void save(byte[] bytes) throws IOException {

                    OutputStream outputStream = null;
                    try {
                        outputStream = new FileOutputStream(***file***);
                        outputStream.write(bytes);
                    }finally {
                        if (outputStream != null)
                            outputStream.close();
                    }
                }
            };

            reader.setOnImageAvailableListener(readerListener, mBackgroundHandler);
            final CameraCaptureSession.CaptureCallback captureListener = new CameraCaptureSession.CaptureCallback() {
                @Override
                public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
                    super.onCaptureCompleted(session, request, result);
                    Toast.makeText(FacialDetection.this, "Saved " + ***file***, Toast.LENGTH_SHORT).show();
                    createCameraPreview();
                }
            };

更新的代码,粗体和斜体是引发错误的原因

标签: javaandroid

解决方案


//Create folder !exist
String folderPath = Environment.getExternalStorageDirectory() +"/myFoldername";
File folder = new File(folderPath);
if (!folder.exists()) {
    File wallpaperDirectory = new File(folderPath);
    wallpaperDirectory.mkdirs();
}
//create a new file
newFile = new File(folderPath, newPhoto.getName());

if (newFile != null) {
    // save image here
    Uri relativePath = Uri.fromFile(newFile);
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, relativePath);
    startActivityForResult(intent, CAMERA_REQUEST);
}

推荐阅读