2013-06-19 8 views
9

In meiner App, die Sie ein Bild auf der SD-Karte speichert, dann Benutzer wählen, was damit zu tun ist. Löschen, speichern oder senden Wenn Sie Löschen drücken. Ich rufe File.delete() es löscht die Dateien, wenn ich in die Galerie gehe und wenn ich manchmal später zurück gehe, sehe ich ein schwarzes Bild, das sagt, dass Datei nicht laden kann. Dieses Bild habe ich zuvor gelöscht. Was ist daran falsch und warum verschwindet es nicht vollständig?File.delete() löscht nicht vollständig leere Bilddatei

Wie speichere ich das Bild:

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

// Dreht das Bild

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

wo onClick wo Bild löschen ist

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

Das ist, weil die Galerie nicht aktualisiert wurde. Starten Sie einen Medien-Scan und es sollte in Ordnung sein. –

+0

ist das nicht, was das tut, wenn es das Foto speichert? 'sendBroadcast (neue Absicht (Intent.ACTION_MEDIA_MOUNTED, Uri.parse (" file: // "+ neue Datei (Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES)," FrontCam ")));' –

+0

Wenn nicht bitte zeig mir was zu Nachdem ich das Bild gelöscht habe –

Antwort

12

Dies ist keine direkte Antwort auf Ihre spezifische Frage, aber ich möchte einen anderen Arbeitsablauf vorschlagen, der das Problem vollständig vermeiden könnte.

Wenn Sie das Bild zuerst nehmen, entweder halten sie im Speicher (BitmapFactory.decodeByteArray statt BitmapFactory.decodeFile verwenden) oder die Datei in eine temporäre Datei schreiben (siehe File.createTempFile). In jedem Fall ist die Idee zu nicht schreiben Sie die Datei in das Verzeichnis der Galerie.

Dann, wenn und wenn der Benutzer 'Speichern' wählt, schreibe/kopiere die Datei in das Verzeichnis der Galerie. Wenn sie "Löschen" wählen, löschen Sie die temporäre Datei (oder nicht, und lassen Sie das Betriebssystem es aufräumen).

Sobald Sie die Datei (Speicher) schreiben, aktualisieren Sie die Galerie mit der einer bestimmten Datei

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

, wie in How can I update the Android Gallery after a photo? erwähnt

+0

Ich habe mich entschieden, das Foto nicht im Speicher zu behalten, weil ich OOM-Fehler bekommen habe. Ich werde das versuchen, obwohl es das Problem zu lösen scheint. –

+0

Das ist großartig, ich benutze das um eine Temp-Datei für jede Bildanforderung zu erstellen. Speichern Sie dann die resultierende Datei in einer Variablen, damit ich im OnActivityResult darauf zugreifen kann. Wenn das Bild abgebrochen wird und der requestCode nicht RESULT_OK ist, rufe ich temp.delete() auf. –