2015-10-22 77 views
0

我有一個允許用戶拍攝圖片的活動,onActivityResult()將在緩存dir中創建一個臨時文件以存儲它,然後將其上傳到服務器。即使file.delete()返回true,文件也不會被刪除

我這是怎麼開始的意圖:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, REQUEST_CODE_CAMERA); 

這裏是內部onActivityResult代碼:

@Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data){ 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == Activity.RESULT_OK) { 

     if (requestCode == REQUEST_CODE_CAMERA) { 
      try { 
       Bitmap photo = (Bitmap) data.getExtras().get("data"); 

       File photoFile = new File(getActivity().getCacheDir(), "userprofilepic_temp.jpg"); 

       boolean b = false; 
       if(photoFile.isFile()){ 
        b = photoFile.delete(); 
       } 
       b = photoFile.createNewFile(); //saves the file in the cache dir, TODO delete this file after account creation 
       userPhotoFilePath = photoFile.getAbsolutePath(); 

       ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
       photo.compress(Bitmap.CompressFormat.JPEG, 90, bytes); 

       FileOutputStream fos = new FileOutputStream(photoFile); 
       fos.write(bytes.toByteArray()); 
       fos.close(); 

       displayUserPhoto(photoFile); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


     } 
     else if (requestCode == REQUEST_CODE_PHOTO_LIBRARY) { 

     } 

    } 
} 

而且displayUserPhoto僅僅是一個簡單的滑行電話:

@Override 
public void displayUserPhoto(File photoFile) { 
    Glide.with(this) 
      .load(photoFile) 
      .into(userPhotoView); 
} 

因爲我想覆蓋以前的圖片,如果用戶決定重新拍照,我檢查photoFile是否是一個文件。如果是,我刪除它。然後創建一個新文件。

問題是它總是返回相同的初始圖片。即使我撥打.delete(),該文件也不會被刪除。

由於我正在使用應用程序的緩存目錄,我不需要寫入權限,但只是incase我試圖包括,但它仍然無法正常工作。

編輯:添加了完整的流程如下

+0

您是否嘗試過通過這個在調試器步進,以後'刪除()'打破,並觀察是否再創建該文件實際上是刪除和寫入新一?如果是這樣,那麼您所看到的行爲可能會由於將相同的數據重新寫入新文件而導致。 –

+1

「即使我調用.delete(),該文件也不會被刪除。」 - 即使文件未被刪除,您也覆蓋其內容。因此,你的問題在別處,也許在你的'displayUserPhoto()'實現中。此外,請刪除'ByteArrayOutputStream',因爲這是一個可怕的內存浪費,因爲您只是轉過身來使用'FileOutputStream'寫數據。將'FileOutputStream'傳遞給'compress()'。 – CommonsWare

+0

@CommonsWare我添加了完整的流程。我不知道它會在哪裏搞亂。流程看起來很基本。 – Sree

回答

1

我真的不知道這裏做什麼,因爲答案是比我最初以爲是完全不同的,所以它並沒有真正涉及到的問題。

Glide不僅在存儲器中保存緩存,還保存在磁盤上,因此爲什麼我一直保持相同的圖像。

的解決方案很簡單:

Glide.with(this) 
      .load(photoFile) 
      .skipMemoryCache(true)//this 
      .diskCacheStrategy(DiskCacheStrategy.NONE)//and this 
      .into(userPhotoView); 
相關問題