2013-03-18 11 views
9

fand ich immer folgende Antwort für meine Frage:Aktualisieren Sie die Galerie nach dem Löschen einer Bilddatei?

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

aber es auf meinem System nicht funktionieren (Nexus4 Android 4. ...)

ich eine Datei erstellen und fügen Sie ihn in die Media-DB mit diesem Code

Wo "Datei" ist die neue Image-Datei, die ich hinzufügen möchte.

nach der Löschen der Datei Ich versuche, um die Galerie refresch von

Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED); 
    Uri contentUri = Uri.parse("file://" + Environment.getExternalStorageDirectory()); 
    intent.setData(contentUri); 
    context.sendBroadcast(intent); 

oder

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

aber es gibt noch leere Platzhalter in der Galery.

Ich weiß nicht, warum? ...

auf der sicheren Seite zu sein, die ich in der AndroidManifest.xml auch meine Aktivität hinzufügen

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

aber das Ergebnis ist das gleiche. Irgendeine Idee, um das Problem zu lösen?

+0

Mögliche Duplikat von http://stackoverflow.com/questions/10716642/android-deleting-an-image –

Antwort

6

prüfen unter Code-Schnipsel alle Fälle für hinzufügen, um zu überprüfen/Löschen/Verschieben Bilddatei programmatisch und intim die Galerie App die Daten zu aktualisieren

/*** 
* Refresh Gallery after add image file programmatically 
* Refresh Gallery after move image file programmatically 
* Refresh Gallery after delete image file programmatically 
* 
* @param fileUri : Image file path which add/move/delete from physical location 
*/ 
public void refreshGallery(String fileUri) { 

    // Convert to file Object 
    File file = new File(fileUri); 

    if (VERSION.SDK_INT >= VERSION_CODES.KITKAT) { 
     // Write Kitkat version specific code for add entry to gallery database 
     // Check for file existence 
     if (file.exists()) { 
      // Add/Move File 
      Intent mediaScanIntent = new Intent(
        Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
      Uri contentUri = Uri.fromFile(new File(fileUri)); 
      mediaScanIntent.setData(contentUri); 
      BaseApplication.appContext.sendBroadcast(mediaScanIntent); 
     } else { 
      // Delete File 
      try { 
       BaseApplication.appContext.getContentResolver().delete(
         MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
         MediaStore.Images.Media.DATA + "='" 
           + new File(fileUri).getPath() + "'", null); 
      } catch (Exception e) { 
       e.printStackTrace(); 

      } 
     } 
    } else { 
     BaseApplication.appContext.sendBroadcast(new Intent(
       Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" 
         + getBaseFolder().getAbsolutePath()))); 
    } 
} 
11

Nach dem KitKat Sie können nicht die Absicht senden laufen Die MediaScanner auf dem gesamten Gerät Speicher, weil es eine CPU I \ O intensive Aufgabe ist und wenn jede einzelne App, die ein Bild herunterladen oder löschen, Anruf dieser Absicht Batterie würde leicht ablaufen, daher haben sie beschlossen, diesen Vorgang zu blockieren. Hier sind Ihre Möglichkeiten:

die alte Art und Weise Gebrauch für Pre-KitKat

Fahren Sie mit filePath:

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { 
    mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, 
       Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
} else{ 


    MediaScannerConnection.scanFile(mContext, filePath, null, new MediaScannerConnection.OnScanCompletedListener() { 
     /* 
     * (non-Javadoc) 
     * @see android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String, android.net.Uri) 
     */ 
     public void onScanCompleted(String path, Uri uri) 
     { 
     Log.i("ExternalStorage", "Scanned " + path + ":"); 
     Log.i("ExternalStorage", "-> uri=" + uri); 
     } 
    }); 

} 

Eine zuverlässigere Methode ist, das MediaStore direkt zu aktualisieren:

// Set up the projection (we only need the ID) 
String[] projection = { MediaStore.Images.Media._ID }; 

// Match on the file path 
String selection = MediaStore.Images.Media.DATA + " = ?"; 
String[] selectionArgs = new String[] { file.getAbsolutePath() }; 

// Query for the ID of the media matching the file path 
Uri queryUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; 
ContentResolver contentResolver = getContentResolver(); 
Cursor c = contentResolver.query(queryUri, projection, selection, selectionArgs, null); 
if (c.moveToFirst()) { 
    // We found the ID. Deleting the item via the content provider will also remove the file 
    long id = c.getLong(c.getColumnIndexOrThrow(MediaStore.Images.Media._ID)); 
    Uri deleteUri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id); 
    contentResolver.delete(deleteUri, null, null); 
} else { 
    // File not found in media store DB 
} 
c.close(); 
Verwandte Themen