尝试将图像保存到目录,保存到未知位置

时间:2018-08-07 15:04:43

标签: java android

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

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

更新后的代码会引发错误

3 个答案:

答案 0 :(得分:0)

您正在致电:     Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)

我推测.getExternalStoragePublicDirectory()意味着获取SD卡上的目录。有getInternal ...方法吗?

答案 1 :(得分:0)

我建议您通过以下方式创建自己的自定义文件夹位置:

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 {
                //Some message
            }
        }else {
            file = new File(folder.getPath() + "/" + UUID.randomUUID(), toString()+ ".jpg");
        }
//The rest of your code...

答案 2 :(得分:0)

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