【问题标题】:How can I save only the last taken image to directory?如何仅将最后拍摄的图像保存到目录?
【发布时间】:2018-02-17 03:32:13
【问题描述】:

在这里,我创建了一个应用程序来拍摄图像并将它们保存到手机的外部存储中。 (以下代码也存在图像未保存到给定位置的问题。)我只想将最后拍摄的图像保存在手机的外部存储器中。每次拍摄新照片时,我都需要删除之前拍摄的图像并仅保存最后拍摄的图像。我该怎么做? 还可以定期连续拍摄图像吗?我搜索并发现我可以使用 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;
    }

}

【问题讨论】:

  • 除了删除最后一个,您可以按照下面的建议为 IMG 设置一个固定名称并覆盖它,最后一个将是当前保存的文件。如果您想保存多张“最后一张”图片,则需要将图片保留在内存中,并且可能会提供一个“是/否”屏幕来确认当前的。

标签: java android android-camera


【解决方案1】:

您可以为照片文件保留一个不变的名称。

  String fname = "MyImage.jpg";

你可以给一些常量名。关于定期拍摄图像,您可以使用处理程序。 你可以阅读更多关于它的信息here。 并确保在相机关闭时移除处理程序。

已编辑 您可以列出您的目录中的文件,mediaStorageDir 在您的情况下。 列出目录下的所有文件,比较最后修改的,删除旧的文件。

【讨论】:

  • 我只希望最后一张照片保存在手机的外部存储器中。每次拍摄新照片时,我都需要删除之前拍摄的图像,只保存最后拍摄的图像。有什么解决办法吗?谢谢。
  • 当你给一个常量名时,之前的图像将被覆盖。
  • 其实我想要的是比较两个图像。一张是现在拍摄的,另一张是在它之前拍摄的。 (我定期拍摄图像,并将新的图像与以前的图像进行比较。如果发生任何变化,我需要将其发送到服务器以检查是否有人检测)手机将充当闭路电视摄像头。但这里它们是图像,而不是视频。(使用智能手机的家庭监控系统。)
  • 只有比较后,我才需要删除之前的图像。
  • 可以在每次拍照时列出该目录下的文件,通过比较文件的lastModifiedData删除较旧的文件。
猜你喜欢
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-14
  • 2017-09-20
  • 1970-01-01
相关资源
最近更新 更多