Android MediaScannerConnection scanFile gebruiken

Ik voeg afbeeldingen toe aan een map op de SDCARD.
Aangezien de afbeeldingen en mijn map niet direct zichtbaar zijn in de Galerij im
proberen de MediaScannerConnection te laten updaten en de . te tonen
map/afbeeldingen in de galerij.
Dit werkt niet zo goed voor mij omdat er niets verschijnt in Galerij.
Ik test alleen in Eclipse AVD.

Ik zie hier niet veel over gepraat, misschien omdat het scanFile nieuw is sinds api8.
Kan iemand laten zien hoe dit wordt gedaan?

Ik probeer het in zowel een service als een activiteit, maar blijf het krijgen
uri=null wanneer onScanCompleted.


Antwoord 1, autoriteit 100%

Ik realiseerde me dat je misschien op zoek was naar een oplossing die zou werken vóór api-niveau 8, en ik kon het antwoord van Mitch niet begrijpen. Ik heb het opgelost door een klasse te bouwen voor het scannen van een enkel bestand:

import java.io.File;
import android.content.Context;
import android.media.MediaScannerConnection;
import android.media.MediaScannerConnection.MediaScannerConnectionClient;
import android.net.Uri;
public class SingleMediaScanner implements MediaScannerConnectionClient {
    private MediaScannerConnection mMs;
    private File mFile;
    public SingleMediaScanner(Context context, File f) {
        mFile = f;
        mMs = new MediaScannerConnection(context, this);
        mMs.connect();
    }
    @Override
    public void onMediaScannerConnected() {
        mMs.scanFile(mFile.getAbsolutePath(), null);
    }
    @Override
    public void onScanCompleted(String path, Uri uri) {
        mMs.disconnect();
    }
}

en je zou het als volgt gebruiken om de MediaScannerConnectioneen enkel bestand te laten scannen:

new SingleMediaScanner(this, file);

Antwoord 2, autoriteit 77%

Ik was op zoek naar hetzelfde en ik vond dit in de ApiDemos, ExternalStorage. Al mijn problemen opgelost terwijl het een enkel bestand scant.

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

Antwoord 3, autoriteit 28%

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

Antwoord 4, autoriteit 23%

Of je kunt de volgende methode gebruiken:

private void scanFile(String path) {
        MediaScannerConnection.scanFile(MainActivity.this,
                new String[] { path }, null,
                new MediaScannerConnection.OnScanCompletedListener() {
                    public void onScanCompleted(String path, Uri uri) {
                        Log.i("TAG", "Finished scanning " + path);
                    }
                });
    }

Bestand scannen als:

scanFile(yourFile.getAbsolutePath());

Antwoord 5, autoriteit 10%

Doe de sendBroadcast niet als u slechts één afbeelding in de galerij wilt laten verschijnen. Dat zou een enorme verspilling van middelen zijn. U moet een MediaScannerConnectionClient maken en vervolgens connect() aanroepen op de MediaScannerConnection die u ervan maakt om het bestand te scannen.
Hier is een voorbeeld:

private MediaScannerConnectionClient mediaScannerConnectionClient = 
    new MediaScannerConnectionClient() {
    @Override
    public void onMediaScannerConnected() {
        mediaScannerConnection.scanFile("pathToImage/someImage.jpg", null);
    }
    @Override
    public void onScanCompleted(String path, Uri uri) {
        if(path.equals("pathToImage/someImage.jpg"))
            mediaScannerConnection.disconnect();
    }
};
new MediaScannerConnection(context, mediaScannerConnectionClient).connect();

Antwoord 6, autoriteit 4%

Laat uw activiteit ‘MediaScannerConnectionClient’ implementeren
en voeg dit toe aan je activiteit:

private void startScan() 
{ 
    if(conn!=null) conn.disconnect();  
    conn = new MediaScannerConnection(YourActivity.this,YourActivity.this); 
    conn.connect(); 
} 
@Override 
public void onMediaScannerConnected() { 
    try{
        conn.scanFile(yourImagePath, "image/*");
       } catch (java.lang.IllegalStateException e){
       }
}
@Override 
public void onScanCompleted(String path, Uri uri) { 
    conn.disconnect(); 
} 

Antwoord 7

File file = new File(absolutePath);
Uri uri = Uri.fromFile(file);
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
sendBroadcast(intent);

Antwoord 8

Gebruik Intentin plaats van MediaScannerConnection. MediaScannerConnectionmaakt uw app gc-fout met IMediaScannerListener.Stub mListener.

Intent mediaScannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
Uri fileContentUri = Uri.parseFile(permFile); // With 'permFile' being the File object
mediaScannerIntent.setData(fileContentUri);
sendBroadcast(mediaScannerIntent);

Other episodes