Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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();
}
like image 401
Will Jamieson Avatar asked Jun 19 '13 02:06

Will Jamieson


1 Answers

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?

like image 90
GreyBeardedGeek Avatar answered Oct 05 '22 09:10

GreyBeardedGeek