2014-09-24 22 views
2

當我從圖庫中刪除文件時,它將刪除,但將創建一個具有相同名稱圖像的文件,其大小爲0字節!該文件將顯示爲畫廊中的破碎圖像!請幫幫我!刪除圖像文件創建一個具有相同名稱的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;  
} 

}

+0

你仍然沒有關閉遊標並使用'file.getAbsolutePath()',爲什麼你使用'MediaScannerConnection.scanFile'兩次,你傳遞String Array使用'new String [] {Tfile.getAbsolutePath(),file.getAbsolutePath() }'而不是 – 2014-09-24 09:25:35

+0

我如你所見,關閉了遊標,使用字符串代替file.getAbsolutePath,並使用MediaScannerConnection.scanFile o nce但仍然存在問題:( – 2014-09-24 13:24:01

回答

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

}

+0

@SagarPilkhwal ch eck出來,我們不應該使用mediaScan或發送廣播刪除文件,我們只是應該從mediaStore mediascan中刪除它或發送廣播是有用的,當我們創建和保存一個位圖;-) – 2014-09-25 08:38:35

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(); 
} 
+0

謝謝,但問題仍然存在。 0字節文件再次創建並在此解決方案 – 2014-09-24 07:32:36

+0

在此解決方案中顯示Android不能立即識別刪除的圖像,但幾分鐘後圖像將隱藏和破碎的圖像再次:( – 2014-09-24 07:55:17

+0

是的,它返回true – 2014-09-24 08:07:00

相關問題