2012-12-10 10 views
6

Ich arbeite an einem Projekt, das ein Modul enthält, um pdf, doc xls-Dateien von SD-Karte zu scannen und eine Liste von ihnen zu machen. Ich möchte auch nur eine Liste von Ordnern machen.So scannen Sie SD-Karte für bestimmte Erweiterung von Dateien in Android?

Da bin ich sehr neu auf Android. Jeder hat eine Idee, dies zu erreichen.

Hier ist mein Code:

public class MediaScannerWrapper implements 
MediaScannerConnection.MediaScannerConnectionClient { 
    private MediaScannerConnection mConnection; 
    private String mPath; 
    private String mMimeType; 

    // filePath - where to scan; 
    // mime type of media to scan i.e. "image/jpeg". 
    // use "*/*" for any media 
    public MediaScannerWrapper(Context ctx, String filePath, String mime){ 
     mPath = filePath; 
     mMimeType = mime; 
     mConnection = new MediaScannerConnection(ctx, this); 
    } 

    // do the scanning 
    public void scan() { 
     mConnection.connect(); 
    } 

    // start the scan when scanner is ready 
    public void onMediaScannerConnected() { 
     mConnection.scanFile(mPath, mMimeType); 
     Log.w("MediaScannerWrapper", "media file scanned: " + mPath); 
    } 

    public void onScanCompleted(String path, Uri uri) { 
     // when scan is completes, update media file tags 
    } 
} 
+0

Haben Sie versucht, [Tiefensuche] (http://en.wikipedia.org/wiki/Depth-first_search) oder [Breitensuche] (http://en.wikipedia.org/ wiki/Brother-first_search)? – rekire

Antwort

21
public void walkdir(File dir) { 
    String pdfPattern = ".pdf"; 

    File[] listFile = dir.listFiles(); 

    if (listFile != null) { 
     for (int i = 0; i < listFile.length; i++) { 

      if (listFile[i].isDirectory()) { 
       walkdir(listFile[i]); 
      } else { 
       if (listFile[i].getName().endsWith(pdfPattern)){ 
           //Do what ever u want 

       } 
      } 
     } 
    } } 

im großen und ganzen sdcard Anruf walkdir(Environment.getExternalStorageDirectory());

+0

Ihr Code rockt. Können wir auch alle Ordner auf diese und alle auf der SD-Karte vorhandenen Dateien auflisten. Bitte Hilfe. –

+2

Dieser Code wird gesprengt, wenn ein symbolischer Link im Pfad vorhanden ist. –

2

Verwendung mit dieser Funktion suchen getExternalStorageDirectory() den SD-Karte Weg zu bekommen. (Nicht hart codieren)

Wiederholen Sie die einzelnen Unterordner und überprüfen Sie die Dateinamen mit der gewünschten Erweiterung. Verwenden Sie die Methode String endswith(), um zu prüfen, ob der Dateiname mit der Erweiterung endet.

Here's a sample code das könnte Ihnen helfen.

2

Ich rate mit Bibliothek, die symbolische Links und Erweiterung Auflösung sowie.

Aufgabe für Dateien mit Erweiterungen scannen:

import android.os.AsyncTask; 
import android.os.Environment; 
import android.util.Log; 
import org.apache.commons.io.FileUtils; 

import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 

public class ScanTask extends AsyncTask<String,Void,ScanTask.Result> { 

    @Override 
    protected Result doInBackground(String... extensions) { 

     if(extensions == null){ 
      extensions = new String[0]; 
     } 

     List<File> files = new ArrayList<File>(); 
     boolean success = false; 
     String status = ""; 

     if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ 
      try { 
       files.addAll(FileUtils.listFiles(Environment.getExternalStorageDirectory(), extensions, true)); 
       success = true; 
       status = "ok"; 
      } catch (Exception e) { 
       Log.e("MyApp","File error:",e); 
       success = false; 
       status = "Scan error"; 
      } 
     }else { 
      success = false; 
      status = "External storage not available"; 
     } 


     return new Result(success,status,files); 
    } 

    public static class Result{ 
     public final boolean success; 
     public final String message; 
     public final List<File> files; 

     public Result(boolean success, String message,List<File> files) { 
      this.success = success; 
      this.message = message; 
      this.files = files; 
     } 
    } 
} 

Verbrauch:

ScanTask task = new ScanTask(){ 
     @Override 
     protected void onPostExecute(Result result) { 
      super.onPostExecute(result); 

      if(result.success){ 
       List<File> files = result.files; 
       //--do something with files-- 
      }else { 
       String error = result.message; 
       //--do something with error message-- 
      } 
     } 
    }; 

    task.execute("mp3","jpeg"); 
0

Sie diesen Code verwenden können:
hier ist die link.

/** 
    * Class to filter files which are having .mp3 extension 
    * */ 
//you can choose the filter for me i put .mp3 
class FileExtensionFilter implements FilenameFilter { 
    public boolean accept(File dir, String name) { 
     return (name.endsWith(".pdf") || name.endsWith(".docs")) || name.endsWith(".3gp") ; 
    } 
}