所以我有一个框架视图,我使用SurfaceView
流式传输摄像机视图。
我想将拍摄的图像保存到尚不存在的新文件夹DCIM/ZES
。在下面的代码中,我得到正确的路径,并在第一次尝试后mkdirs()
返回true。即使exists()
方法将返回true
在第一次尝试同一个目录后。
获取输出文件名创建目录:
private static File getOutputMediaFile(int type){
// getting the 'MES' folder route
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM), "MES");
Log.i("CAMERA", "SAVING IMAGE TO FILE");
// Create the storage directory if it does not exist
if (!mediaStorageDir.exists()){
if (!mediaStorageDir.mkdirs()){
Log.d("MyCameraApp", "failed to create directory");
return null;
}
}
// Create a media file name
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if (type == MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE){
mediaFile = new File(mediaStorageDir.getAbsolutePath() + File.separator +
"IMG_"+ timeStamp + ".jpg");
} else if(type == MediaStore.Files.FileColumns.MEDIA_TYPE_VIDEO) {
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"VID_"+ timeStamp + ".mp4");
} else {
return null;
}
return mediaFile;
}
保存图片:
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera c) {
File pictureFile = getOutputMediaFile(MediaStore.Files.FileColumns.MEDIA_TYPE_IMAGE);
if (pictureFile == null){
Log.d("CAMERA", "Error creating media file, check storage permissions");
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.close();
Log.i("FILE", "File was saved in " + pictureFile.getName());
} catch (FileNotFoundException e) {
Log.e("CAMERA", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.e("CAMERA", "Error accessing file: " + e.getMessage());
}
}
};
然后我在pictureCallback
方法中使用了takePicture()
,这样就可以了。
不起作用的是:没有保存图片。没有创建目录(我可以看到)。首次尝试后使用exists()
返回true
检查目录是否存在。
在网上寻找解决方案的一整天,但没有成功,
尝试使用MediaStore.Images.Media.insertImage()
方法,但无法配置目录图像被保存,所以它没有用。
真的很沮丧这个
感谢您的帮助