Java 试图将图像保存到目录,保存到未知位置
我正试图为我的论文创建一个面部/情绪检测应用程序,但遇到了阻碍我进步的障碍,我无法找出它阻止图像保存到手机目录的原因。它似乎是保存到SD卡,但我不使用SD卡在我的手机/模拟DCIMJava 试图将图像保存到目录,保存到未知位置,java,android,Java,Android,我正试图为我的论文创建一个面部/情绪检测应用程序,但遇到了阻碍我进步的障碍,我无法找出它阻止图像保存到手机目录的原因。它似乎是保存到SD卡,但我不使用SD卡在我的手机/模拟DCIM file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)+ "/" + UUID.randomUUID(), toString()+ ".jpg"); ImageReade
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();
}
};
更新后的代码,粗体和斜体是引发错误的原因您正在调用:
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u DCIM)
我推测.getExternalStoragePublicDirectory()表示获取SD卡上的目录。是否有一个内部。。。方法?我建议您通过以下方式创建自己的自定义文件夹位置:
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...
我已经更新了代码,并且出现了错误。我相信我把它加错了。两个带******的“文件”变量用红色突出显示。。它想让我把它改成finalfile,这使得所有其他文件变量都想被删除,你需要把它变成final,因为你是从一个内部类中访问它的。并将Toast更改为
…file.getPath().toString()
对不起,我很难理解Toast更改的代码行是什么?当我移除toast并添加它时,它会是什么样子?现在它会高亮显示所有黄色,类似于下面的toast.makeText(FacialDetection.this,“Saved”+file.getPath().toString(),toast.LENGTH_SHORT).show()代码>我将如何用当前的代码实现这一点?
//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);
}