Android 自定义相机新捕获的图像将覆盖旧图像

Android 自定义相机新捕获的图像将覆盖旧图像,android,camera-api,Android,Camera Api,我已经创建了一个自定义相机,它可以捕捉图片并将其存储在手机内部存储器的文件夹中。但每当我拍一张新照片时,它都会覆盖旧照片 main活动 public class MainActivity extends AppCompatActivity { Camera camera; Button capture, gallery; FrameLayout frameLayout; ShowCamera showCamera; @Override protected void onCreate(Bundle

我已经创建了一个自定义相机,它可以捕捉图片并将其存储在手机内部存储器的文件夹中。但每当我拍一张新照片时,它都会覆盖旧照片

main活动

public class MainActivity extends AppCompatActivity {
Camera camera;
Button capture, gallery;
FrameLayout frameLayout;
ShowCamera showCamera;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    frameLayout = findViewById(R.id.frameLayout);
    capture = findViewById(R.id.button);
    gallery = findViewById(R.id.button2);

    camera = Camera.open();
    showCamera = new ShowCamera(this,camera);
    frameLayout.addView(showCamera);

    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            captureImage(showCamera);
        }
    },4000);
}

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File picture_file = getOutputMediaFile();
            if(picture_file==null) {
                return;
            }
            try {
             FileOutputStream fos = new FileOutputStream(picture_file);
                fos.write(data);
                fos.close();
                camera.startPreview();
            }  catch (IOException e) {
                e.printStackTrace();
            }
        }

         };


private File getOutputMediaFile() {
    String state = Environment.getExternalStorageState();
    if(!state.equals(Environment.MEDIA_MOUNTED)) {
        return null;
    }
    else {
        File folder_gui = new File (Environment.getExternalStorageDirectory() + File.separator+"GUI");
        if(!folder_gui.exists()) {
            folder_gui.mkdirs();
        }
        File outputFile = new File(folder_gui,"temp.jpg");
        return outputFile;
    }
}

public void captureImage(View v) {
    if(camera!=null) {
        camera.takePicture(null,null,mPictureCallback);
    }
}
}
ShowCamera

public class ShowCamera extends SurfaceView implements SurfaceHolder.Callback{

Camera camera;
SurfaceHolder holder;

public ShowCamera(Context context, Camera camera) {
    super(context);
    this.camera = camera;
    holder = getHolder();
    holder.addCallback(this);

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    camera.stopPreview();
    camera.release();
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    Camera.Parameters params = camera.getParameters();
    //change the orientation of the camera

    List<Camera.Size> sizes = params.getSupportedPictureSizes();
    Camera.Size mSize = null;
    for(Camera.Size size : sizes) {
        mSize = size;
    }

    if(this.getResources().getConfiguration().orientation!= Configuration.ORIENTATION_LANDSCAPE) {
        params.set("orientation","portrait");
        camera.setDisplayOrientation(90);
        params.setRotation(90);
    }
    else {
        params.set("orientation","landscape");
        camera.setDisplayOrientation(0);
        params.setRotation(0);
    }
    params.setPictureSize(mSize.width,mSize.height);

    camera.setParameters(params);
    try {
        camera.setPreviewDisplay(holder);
        camera.startPreview();
    } catch (IOException e) {
        e.printStackTrace();
    }

}
}
public类ShowCamera扩展SurfaceView实现SurfaceHolder.Callback{
摄像机;
表面焊钳;
公共ShowCamera(上下文、摄影机){
超级(上下文);
这个。照相机=照相机;
holder=getHolder();
holder.addCallback(本);
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
camera.stopPreview();
相机。释放();
}
@凌驾
已创建的公共空白表面(表面持有人){
Camera.Parameters params=Camera.getParameters();
//更改摄影机的方向
列表大小=params.getSupportedPictureSizes();
Camera.Size mSize=null;
用于(相机尺寸:尺寸){
mSize=大小;
}
if(this.getResources().getConfiguration().orientation!=Configuration.orientation\u横向){
参数设置(“方向”、“肖像”);
摄像头。设置显示方向(90);
参数设置旋转(90);
}
否则{
参数集(“方向”、“景观”);
摄像头。设置显示方向(0);
参数设置旋转(0);
}
参数setPictureSize(mSize.width,mSize.height);
摄像机。设置参数(参数);
试一试{
摄像头。设置预览显示(支架);
camera.startPreview();
}捕获(IOE异常){
e、 printStackTrace();
}
}
}

拍摄新图片时,我希望将该图片添加到文件夹中,而不是覆盖现有图片。如何执行此操作?

将代码替换为以下内容

    private File getOutputMediaFile() {
    String state = Environment.getExternalStorageState();
    if(!state.equals(Environment.MEDIA_MOUNTED)) {
        return null;
    }
    else {
        File folder_gui = new File (Environment.getExternalStorageDirectory() + File.separator+"GUI");
        if(!folder_gui.exists()) {
            folder_gui.mkdirs();
        }
        File outputFile = new File(folder_gui,System.currentTimeInMillies()+."jpg");
        return outputFile;
    }
}

因为您每次都提供相同的名称,所以它将替换旧文件

您每次都覆盖相同的
temp.jpg
。。每次使用一个唯一的名称,它将为您可以使用的每个图像创建一个新文件
“temp”+System.currentTimeMillis()+“jpg”
。尝试过之后,它成功了,谢谢!