2012-12-10 35 views
6

Pracuję nad projektem, który zawiera moduł do skanowania plików pdf, doc xls z karty SD i tworzenia ich listy. Chcę również utworzyć listę tylko folderów.Jak skanować kartę SD pod kątem konkretnego rozszerzenia plików w systemie Android?

Ponieważ jestem bardzo nowy na Androida. Każdy ma pomysł na osiągnięcie tego.

Oto mój kod:

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

Czy spróbować [przeszukiwanie w głąb] (http://en.wikipedia.org/wiki/Depth-first_search) lub [Szerokość pierwszego wyszukiwania] (http://en.wikipedia.org/ wiki/Breadth-first_search)? – rekire

Odpowiedz

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 

       } 
      } 
     } 
    } } 

Aby wyszukać w całej rozmowy sdcard tej funkcji przy użyciu walkdir(Environment.getExternalStorageDirectory());

+0

Twój kod kołysze. Czy możemy również wyświetlić wszystkie foldery tylko dla tego i wszystkich plików obecnych na karcie SD. Proszę pomóż. –

+2

Ten kod zostanie wysadzony, jeśli w ścieżce znajduje się dowiązanie symboliczne. –

2

Korzystając getExternalStorageDirectory() uzyskać ścieżkę karty SD. (Nie koduj tego)

Przeprowadź pętlę przez każdy podfolder i sprawdź nazwy plików z żądanym rozszerzeniem. Użyj metody String endswith(), aby sprawdzić, czy nazwa pliku kończy się rozszerzeniem.

Here's a sample code, które mogą ci pomóc.

2

Radzę korzystać z biblioteki commons.io, która obsługuje również dowiązania symboliczne i rozdzielczość rozszerzeń.

Zadanie skanowania w poszukiwaniu plików z rozszerzeniami:

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

Zastosowanie:

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

Można użyć tego kodu:
Oto 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") ; 
    } 
}