8

在我的应用程序中,您拍摄一张照片将其保存到 SD 卡,然后用户可以选择如何处理它。删除、保存或发送。如果按删除。我称它为File.delete()在我去画廊查看文件时删除文件,然后当我有时回去时,我看到一个黑色图像,说文件无法加载。该图像是我之前尝试删除的图像。这有什么问题,为什么它没有完全消失?

我如何保存图像:

public static File getOutputMediaFile(byte[] data){
    image= BitmapFactory.decodeByteArray(data, 0, data.length);
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "FrontFlash");
    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()){
        if (!mediaStorageDir.mkdirs()) return null;
    }

    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg");
    return mediaFile;
}
@Override
public void onPictureTaken(byte[] data, Camera camera){
    pictureFile = Util.getOutputMediaFile(data);
    if (pictureFile == null){
        Toast.makeText(this, "Couldn't create file", Toast.LENGTH_SHORT).show();
    }
    else{
        try{
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
        }
        catch (FileNotFoundException e){
            Toast.makeText(this, "File not found exception", Toast.LENGTH_SHORT).show();
        }
        catch (IOException e){
            Toast.makeText(this, "IO Exception", Toast.LENGTH_SHORT).show();
        }
    }

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "FrontCam"))));
    String photopath = pictureFile.getPath().toString();

//旋转图片

bmp = BitmapFactory.decodeFile(photopath);
matrix = new Matrix();
matrix.postRotate(270);
bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);
    FileOutputStream fOut;
    try {
        fOut = new FileOutputStream(pictureFile);
        bmp.compress(Bitmap.CompressFormat.JPEG, 85, fOut);
        fOut.flush();
        fOut.close();
    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

where onClick 删除图像的位置

public void exit( View view){
    deleted = pictureFile.delete();
    //startActivity(home);
    close();
    finish();
}
4

2 回答 2

12

这不是对您的具体问题的直接回答,但我想提出一个可以完全避免该问题的不同工作流程。

当您第一次拍摄照片时,要么将其保存在内存中(使用BitmapFactory.decodeByteArray而不是BitmapFactory.decodeFile),要么将文件写入临时文件(请参阅File.createTempFile)。无论哪种情况,我们的想法都是将文件写入画廊的目录。

然后,如果并且当用户选择“保存”时,将文件写入/复制到画廊的目录。如果他们选择“删除”,请删除临时文件(或不删除,让操作系统清理它)。

写入文件(保存)后,使用一个特定文件更新图库

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(myNewFile)));

如在照片后如何更新 Android 图库中所述?

于 2013-06-23T03:19:04.853 回答
0

这对我有用!这是科特林解决方案

 private fun DeleteImage(path: String) {
`val fullPathToFile = path
                activity!!.contentResolver.delete(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                MediaStore.Images.Media.DATA + "=?", arrayOf(fullPathToFile))}

`

于 2021-02-23T06:03:06.573 回答