2013-06-19 11 views
9

W mojej aplikacji wykonuje zdjęcie zapisuje go na karcie SD, a następnie użytkownik wybiera, co z nim zrobić. Usuń, zapisz lub wyślij. Jeśli naciśniesz delete. Nazywam je File.delete(), gdy pliki są usuwane, gdy przeglądam galerię, a potem, kiedy czasami wracam, widzę czarny obraz, który nie może załadować pliku. Ten obraz jest tym, który próbowałem usunąć wcześniej. Co jest z tym nie tak i dlaczego nie całkowicie znika?File.delete() nie usuwa całkowicie pustego obrazu obrazu pozostawionego za

Jak zapisać obraz:

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

// Obraca obraz

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

gdzie onClick gdzie obraz jest usunięcie

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

To dlatego, że galeria nie została zaktualizowana. Wyzwalaj skanowanie mediów i powinno być dobrze. –

+0

czy to nie robi tego, gdy zapisuje zdjęcie? 'sendBroadcast (new Intent (Intent.ACTION_MEDIA_MOUNTED, Uri.parse (" file: // "+ nowy plik (Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES)," FrontCam ")));' –

+0

jeśli nie, pokaż mi co umieścić po usunięciu obrazu –

Odpowiedz

12

To nie jest bezpośrednią odpowiedzią na Twoje konkretne pytanie, ale chciałbym zaproponować inny przepływ pracy, który może całkowicie wyeliminować problem.

Podczas pierwszego robienia zdjęcia zapisz go w pamięci (użyj BitmapFactory.decodeByteArray zamiast BitmapFactory.decodeFile) lub zapisz plik w pliku tymczasowym (patrz File.createTempFile). W obu przypadkach chodzi o to, aby nie zapisywać pliku w katalogu galerii.

Następnie, jeśli i kiedy użytkownik wybierze opcję "zapisz", napisz/skopiuj plik do katalogu galerii. Jeśli wybierze opcję "usuń", usuń plik tymczasowy (lub nie, i pozostaw system operacyjny czysty).

Raz piszesz plik (zapisz), zaktualizować galerię z jednego konkretnego pliku przy użyciu

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

jak wspomniano w How can I update the Android Gallery after a photo?

+0

Postanowiłem nie przechowywać zdjęcia w pamięci, ponieważ otrzymywałem błędy OOM. Spróbuję tego, chociaż wygląda na to, że powinno rozwiązać problem. –

+0

To jest świetne, używam tego do utworzenia pliku Temp dla każdego żądania obrazka, następnie przechowuj wynikowy plik w zmiennej, aby uzyskać do niego dostęp w OnActivityResult. Jeśli obraz zostanie anulowany, a requestCode nie jest RESULT_OK, wywołuję temp.delete(). –

Powiązane problemy