如何仅将最后拍摄的图像保存到目录?
How can I save only the last taken image to directory?
我在这里创建了一个应用程序来拍摄图像并将它们保存到 phone 的外部存储中。 (下面的代码也有一个问题,图像没有保存到给定的位置。)我只想将最后拍摄的图像保存在phone.Everytime的外部存储器中我拍了一张新照片,我需要删除之前拍摄的图像,只保存最后拍摄的图像。我该怎么做? 是否可以定期连续拍摄图像?我搜索了一下,发现可以使用 Timer() 来完成。可能吗?谢谢。
编辑- 其实我想要的是比较两个图像。一个是此刻拍摄的,另一个是紧接在它之前拍摄的。 (我每隔一定时间拍照,我会把新的和之前的对比。)只有对比之后,我才会删除之前的。
public class MyCamera extends Activity {
private Camera mCamera;
private CameraPreview mCameraPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCamera = getCameraInstance();
mCameraPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mCameraPreview);
Button captureButton = (Button) findViewById(R.id.button_capture);
captureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.takePicture(null, null, mPicture);
}
});
}
/**
* Helper method to access the camera returns null if it cannot get the
* camera or does not exist
*
* @return
*/
private Camera getCameraInstance() {
Camera camera = null;
try {
camera = Camera.open();
} catch (Exception e) {
// cannot get camera or does not exist
}
return camera;
}
PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile();
if (pictureFile == null) {
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d(TAG, e.getMessage());
} catch (IOException e) {
Log.d(TAG, e.getMessage());
}
}
};
private static File getOutputMediaFile() {
File mediaStorageDir = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"MyCameraApp");
if (!mediaStorageDir.exists()) {
mediaStorageDir.mkdirs();
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());
String fname = "IMG_" + timeStamp + ".jpg";
System.out.println(fname);
File mediaFile;
mediaFile = new File(mediaStorageDir, fname);
return mediaFile;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.my_camera, menu);
return true;
}
}
您可以为您的照片文件保留一个固定名称。
String fname = "MyImage.jpg";
你可以给一些常量名。关于定期拍摄图像,您可以使用处理程序。
您可以阅读更多相关信息 here。
并确保在相机关闭时移除手柄。
已编辑
您可以列出目录中的文件,mediaStorageDir
在您的案例中。
列出目录下的所有文件,通过比较最后修改时间,删除较旧的文件。
我在这里创建了一个应用程序来拍摄图像并将它们保存到 phone 的外部存储中。 (下面的代码也有一个问题,图像没有保存到给定的位置。)我只想将最后拍摄的图像保存在phone.Everytime的外部存储器中我拍了一张新照片,我需要删除之前拍摄的图像,只保存最后拍摄的图像。我该怎么做? 是否可以定期连续拍摄图像?我搜索了一下,发现可以使用 Timer() 来完成。可能吗?谢谢。
编辑- 其实我想要的是比较两个图像。一个是此刻拍摄的,另一个是紧接在它之前拍摄的。 (我每隔一定时间拍照,我会把新的和之前的对比。)只有对比之后,我才会删除之前的。
public class MyCamera extends Activity {
private Camera mCamera;
private CameraPreview mCameraPreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCamera = getCameraInstance();
mCameraPreview = new CameraPreview(this, mCamera);
FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
preview.addView(mCameraPreview);
Button captureButton = (Button) findViewById(R.id.button_capture);
captureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mCamera.takePicture(null, null, mPicture);
}
});
}
/**
* Helper method to access the camera returns null if it cannot get the
* camera or does not exist
*
* @return
*/
private Camera getCameraInstance() {
Camera camera = null;
try {
camera = Camera.open();
} catch (Exception e) {
// cannot get camera or does not exist
}
return camera;
}
PictureCallback mPicture = new PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile();
if (pictureFile == null) {
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d(TAG, e.getMessage());
} catch (IOException e) {
Log.d(TAG, e.getMessage());
}
}
};
private static File getOutputMediaFile() {
File mediaStorageDir = new File(
Environment
.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
"MyCameraApp");
if (!mediaStorageDir.exists()) {
mediaStorageDir.mkdirs();
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());
String fname = "IMG_" + timeStamp + ".jpg";
System.out.println(fname);
File mediaFile;
mediaFile = new File(mediaStorageDir, fname);
return mediaFile;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.my_camera, menu);
return true;
}
}
您可以为您的照片文件保留一个固定名称。
String fname = "MyImage.jpg";
你可以给一些常量名。关于定期拍摄图像,您可以使用处理程序。 您可以阅读更多相关信息 here。 并确保在相机关闭时移除手柄。
已编辑
您可以列出目录中的文件,mediaStorageDir
在您的案例中。
列出目录下的所有文件,通过比较最后修改时间,删除较旧的文件。