File.delete() does not completely delete image blank image file left behind

蓝咒 提交于 2021-02-06 09:12:41

问题


In my app you it takes a picture saves it to the SD card then user gets to chose what to do with it. Delete, save, or send. If you press delete. I call File.delete() it deletes the files when I go look in the gallery and then when I sometimes go back later I see a black image saying file cannot load. That image is the one I attempted to delete earlier. What is wrong with this and why doesn't it completely go away?

How I save the image:

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();

//Rotates the image

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 where image is delete

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

回答1:


This isn't a direct answer to your specific question, but I'd like to propose a different work flow that may avoid the problem entirely.

When you first take the picture, either keep it in memory (use BitmapFactory.decodeByteArray instead of BitmapFactory.decodeFile), or write the file to a temp file (see File.createTempFile). In either case, the idea is to not write the file to the gallery's directory.

Then, if and when the user chooses 'save', write/copy the file to the to the gallery's directory. If they choose 'delete', delete the temp file (or don't, and let the OS clean it up).

Once you write the file (save), update the gallery with the one specific file using

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

as mentioned in How can I update the Android Gallery after a photo?



来源:https://stackoverflow.com/questions/17182161/file-delete-does-not-completely-delete-image-blank-image-file-left-behind

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!