2010-11-10 9 views
15

Ho aggiunto una inserita nella Galleria utilizzando API Android come segue:Come posso aggiornare la Galleria dopo aver inserito un'immagine in Android?

Images.Media.insertImage (ctx.getContentResolver(), "scard/test.jpg", "Ciao", "descrizione ");

In realtà l'immagine che ho passato il suo percorso completo (scard/test.jpg) è già inserita correttamente nel DB, ma quando si apre la galleria non si può vederla se non si spegne/si accende il dispositivo o Monta/Smonta la memoria esterna.

C'è un modo per aggiornare la galleria su richiesta?

Grazie

Bassel Kh.

+0

l'aproach non funziona perché si utilizza un percorso file relativo "scard/test.jpg" invece di un percorso file "/scard/test.jpg" assoluto. – k3b

risposta

18

La soluzione che utilizza Media Scanner (sendBroadcast) è molto buona e la sto utilizzando nella mia applicazione.

Ma, probabilmente, su schede SD con un sacco di foto e dati, questa operazione dovrebbe raggiungere un alto livello di elaborazione.

C'è un'altra soluzione, dopo aver salvato il file multimediale sulla galleria, è necessario indicare al DB della galleria che è stato inserito un altro file. Ciò può essere fatto così:

private void addImageGallery(File file) { 
    ContentValues values = new ContentValues(); 
    values.put(MediaStore.Images.Media.DATA, file.getAbsolutePath()); 
    values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg"); // setar isso 
    getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
} 

Questo codice non salva il file multimediale alla galleria, salva solo le informazioni su un nuovo file nella galleria DB. È necessario memorizzare il file reale prima.

Questa soluzione è più veloce perché la galleria non sarà completamente riesaminata. Ma non è così affidabile perché tutte le informazioni sul file sono state aggiunte manualmente.

+0

ottima soluzione. sta funzionando bene. +1 –

3
static public boolean resetExternalStorageMedia(Context context) { 
    if (Environment.isExternalStorageEmulated()) 
     return (false); 
    Uri uri = Uri.parse("file://" + Environment.getExternalStorageDirectory()); 
    Intent intent = new Intent(Intent.ACTION_MEDIA_MOUNTED, uri); 

    context.sendBroadcast(intent); 
    return (true); 
} 

static public void notifyMediaScannerService(Context context, String path) { 
    MediaScannerConnection.scanFile(context, 
      new String[] { path }, null, 
      new MediaScannerConnection.OnScanCompletedListener() { 
     public void onScanCompleted(String path, Uri uri) { 
      Log.i("ExternalStorage", "Scanned " + path + ":"); 
      Log.i("ExternalStorage", "-> uri=" + uri); 
     } 
    }); 
} 
21

ho incontrato questo problema da poco, ho provato @ soluzione Samuh, ma non funziona perfettamente fino a quando ho trovato la soluzione da Google's example:

// Tell the media scanner about the new file so that it is 
    // immediately available to the user. 
    MediaScannerConnection.scanFile(this, 
      new String[] { file.toString() }, null, 
      new MediaScannerConnection.OnScanCompletedListener() { 
     public void onScanCompleted(String path, Uri uri) { 
      Log.i("ExternalStorage", "Scanned " + path + ":"); 
      Log.i("ExternalStorage", "-> uri=" + uri); 
     } 
    }); 

io ho provato e ha lavorato senza problemi.

O, allo stesso modo, si potrebbe voler dare un'occhiata al riferimento del MediaScanner Class e qualcuno su StackOverflow fatto questa domanda prima: Image, saved to sdcard, doesn't appear in Android's Gallery app

0

È possibile utilizzare questo per l'aggiornamento Galleria Android:

public void refreshAndroidGallery(Uri fileUri) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      Intent mediaScanIntent = new Intent(
        Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
      mediaScanIntent.setData(fileUri); 
      mContext.sendBroadcast(mediaScanIntent); 
     } else { 
      mContext.sendBroadcast(new Intent(
        Intent.ACTION_MEDIA_MOUNTED, 
        Uri.parse("file://" + Environment.getExternalStorageDirectory()))); 
     } 
    } 
Problemi correlati