删除图像文件会创建一个具有相同名称的0字节文件

时间:2014-09-24 06:47:37

标签: android image

当我从图库中删除文件时,它将删除但是将创建一个具有相同图像名称的文件,其大小为0字节!该文件将在库中显示为已损坏的图像!请帮帮我!

public void browse(View v)
{
    //This Method is for Browse Button OnClick to get an Image
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent,
            "Select Picture"), SELECT_PICTURE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            File imgFile = new  File(selectedImagePath);
            //Deleting Image
            imgFile.delete();
            //Update Android Gallery to remove Image immediately
            MediaScannerConnection.scanFile(this,
                    new String[] { imgFile.getAbsolutePath() }, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String path, Uri uri) {
                        }
                    }
                );
        }

    }
}
public String getPath(Uri uri) {
    if( uri == null ) {
        return null;
    }
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    if( cursor != null ){
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);
    }
    return uri.getPath();
}

enter image description here

这是我的全班: (browse()方法将获取一个图像,start()方法将压缩它并保存为新文件,然后尝试删除出现问题的原始图像:

public class Lab extends Activity {

int counter = 0;
long lastModDate;
public static String parent;
public static int deg = 0; 

public static String f_or = "";
public static String f_ta = "";
public static String f_original_Image_dim = "";
private static final int SELECT_PICTURE = 1;
private String selectedImagePath;
Timer timer1;
Bitmap myBitmap;
int currentFormula = 3;
TouchImageView iv1;
TextView l1;
Button btn3;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_lab);
    l1 = (TextView) findViewById(R.id.txtl1);
    iv1 = (TouchImageView) findViewById(R.id.iv_selectedpic);

}


public void zard(View v)
{
    l1.setText("F = A");
    currentFormula = 1;
}
public void ghermez(View v)
{
    l1.setText("F = B");
    currentFormula = 2;
}
public void sabz(View v)    
{
    l1.setText("F = C");
    currentFormula = 3;
}

public void next(View v)    
{
    Intent i = new Intent(Lab.this, Resoflab.class);
    startActivity(i);
}
public void browse(View v)
{
    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent,
            "Select Picture"), SELECT_PICTURE);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            File imgFile = new  File(selectedImagePath);
            lastModDate = imgFile.lastModified();
            try
            {
                if(imgFile.exists()){
                    counter = 0;
                    Resoflab.de = 0;
                    System.gc();
                    BitmapFactory.Options optionss = new BitmapFactory.Options();
                    optionss.inPreferredConfig = Bitmap.Config.RGB_565;
                    optionss.inScaled = false;
                    myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(),optionss);
                    ExifInterface exif = new ExifInterface(selectedImagePath);
                    int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
                    int rotationInDegrees = exifToDegrees(rotation);
                    deg = rotationInDegrees;
                    Matrix matrix = new Matrix();
                    if (rotation != 0f) {
                        matrix.preRotate(rotationInDegrees);
                        myBitmap = Bitmap.createBitmap(myBitmap, 0, 0, myBitmap.getWidth(), myBitmap.getHeight(), matrix, true);
                    }
                    f_original_Image_dim = myBitmap.getWidth() + "*" + myBitmap.getHeight();
                    iv1.setImageBitmap(myBitmap);

                    //TouchImageview not displayed image after setImageBitmap so I set setZoom(1) after some miliseconds and its OK now
                    //This is why I used timer
                    timer1 = new Timer();
                    timer1.schedule(new TimerTask() {           
                        @Override
                        public void run() {
                            TimerMethod1();
                        }
                    }, 0, 300);
                    //iv2.setImageBitmap(myBitmap);
                }
            }
            catch(Exception ee)
            {
                Toast.makeText(Lab.this,getResources().getString(R.string.khateyezir)  + "\n\n" +  ee.toString(),Toast.LENGTH_LONG).show();
            }

        }
        else
        {
            //btn3.setVisibility(View.GONE);
        }
    }
}

private void TimerMethod1()
{
    this.runOnUiThread(Timer_Tick1);
}
private Runnable Timer_Tick1 = new Runnable() {
    public void run() {
        try
        {
            counter++;
            iv1.setZoom(1);
            if(counter == 4)
            {
                counter = 0;
                timer1.cancel();
            }
        }
        catch(Exception e)
        {
        }
    }
};

public void start(View v)
{
    try
    {
        if(selectedImagePath.contains("_optimizes_"))
        {
            //Toast that Image had been optimized
            Toast.makeText(Lab.this,getResources().getString(R.string.isoptimized),Toast.LENGTH_LONG).show();
            return;
        }
        String fm = "C";
        if(currentFormula == 2)fm = "B";
        if(currentFormula == 1)fm = "A";
        File file = new File(selectedImagePath);
        if(file.exists() == false)
        {
            Toast.makeText(Lab.this,getResources().getString(R.string.hasdeleted),Toast.LENGTH_LONG).show();
            return;
        }
        parent = file.getParent();

        String name = file.getName();
        String extension = FileUtils.getExtension(name);

        String fileNameWithOutExt = FileUtils.removeExtension(name);
        String Targetname = fileNameWithOutExt + "_optimizes_" + fm + "." + extension;
        String TargetPath = parent + "/" + Targetname;  


        File Tfile = new File(parent, Targetname);
        FileOutputStream outStream = new FileOutputStream(Tfile);

        if(currentFormula == 3)
            myBitmap.compress(Bitmap.CompressFormat.JPEG, 70, outStream);
        else if(currentFormula == 2)
            myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, outStream);
        else myBitmap.compress(Bitmap.CompressFormat.JPEG, 80, outStream);
        outStream.flush();
        outStream.close();
        Tfile.setLastModified(lastModDate);
        //sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Tfile)));
        //SingleMediaScanner sc = new SingleMediaScanner(Lab.this, Tfile);

        String Tfilepath = Tfile.getAbsolutePath();
        String filepath = file.getAbsolutePath();

        //HERE IS MY PROBLEM:
        file.delete();
        MediaScannerConnection.scanFile(this,
                new String[] { Tfilepath, filepath}, null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                        //now visible in gallery
                    }
                }
            );
        //f_ta = TargetPath;
        //f_original_Image_dim = selectedImagePath;
        //Intent i = new Intent(Lab.this, Resoflab.class);
        //startActivity(i);
    }
    catch(Exception ee)
    {
        Toast.makeText(Lab.this,getResources().getString(R.string.khateyezir)  + "\n\n" +  ee.toString(),Toast.LENGTH_LONG).show();
    }
}

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    //btn3.setVisibility(View.GONE);
}


public String getPath(Uri uri) {
    if( uri == null ) {
        return null;
    }
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    if( cursor != null ){
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String ret = cursor.getString(column_index);
        cursor.close();
        return ret;
    }
    return uri.getPath();
}
private static int exifToDegrees(int exifOrientation) {        
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; } 
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {  return 180; } 
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {  return 270; }            
    return 0;    
}

}

2 个答案:

答案 0 :(得分:1)

删除图片后,例如通过调用myfile.delete(),我们必须将其从mediaStore中删除,这是从媒体商店删除文件的功能:

public static void deleteFileFromMediaStore(final ContentResolver contentResolver, final File file) {
String canonicalPath;
try {
    canonicalPath = file.getCanonicalPath();
} catch (IOException e) {
    canonicalPath = file.getAbsolutePath();
}
final Uri uri = MediaStore.Files.getContentUri("external");
final int result = contentResolver.delete(uri,
        MediaStore.Files.FileColumns.DATA + "=?", new String[] {canonicalPath});
if (result == 0) {
    final String absolutePath = file.getAbsolutePath();
    if (!absolutePath.equals(canonicalPath)) {
        contentResolver.delete(uri,
                MediaStore.Files.FileColumns.DATA + "=?", new String[]{absolutePath});
    }
}

}

答案 1 :(得分:0)

尝试使用:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            File imgFile = new  File(selectedImagePath);
            String imgFilePath = imgFile.getAbsolutePath(); // <-- Add this
            //Deleting Image
            imgFile.delete();
            //Update Android Gallery to remove Image immediately
            MediaScannerConnection.scanFile(this,
                    new String[] { imgFilePath }, null,    // <-- change this
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String path, Uri uri) {
                        }
                    }
                );
        }
    }
}

修改

尝试使用此机制,它将更新图库:

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

将此添加到您的应用程序清单:

    <intent-filter>
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <data android:scheme="file" /> 
    </intent-filter>

修改

public String getPath(Uri uri) {
    if( uri == null ) {
        return null;
    }
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    if( cursor != null ){
        int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
        String path = cursor.getString(column_index); //<-- Add this
        cursor.close(); //<-- Add this
        return path;    //<-- change this
    }
    return uri.getPath();
}