2011-02-07 2 views
2

Мое приложение Android должно посмотреть в каталог камеры по умолчанию и получить имена файлов JPEG, созданных в пределах временного диапазона. В настоящее время я делаю это с помощью нижеприведенного фрагмента кода. Идея состоит в том, чтобы отфильтровать файлы не только с помощью расширения «jpg», но также использовать тот факт, что имена файлов имеют дату и время в них.Самый эффективный способ чтения всех файлов в список в Android

Я запускаю нижнюю функцию getImages() в потоке, поэтому сам пользовательский интерфейс не влияет. Я замечаю, что это займет некоторое время, если в каталоге есть много файлов, даже после всего этого. Есть ли более быстрый алгоритм или специальные функции Android, которые я могу использовать, чтобы оптимизировать его дальше?


private boolean getImages() 
    { 
     boolean status=true; 
     File dir = new File(picPath); 
     //Optimize file search by setting the common file prefix as a filter 
     //get the date format used by camera to store files. 
     String startStr=startTime.format3339(false); 
     String endStr=endTime.format3339(false); 
     //Loop through each character of start time 
     //and compare with end time till a mismatch is found 
     int len=startStr.length(); 
     int idx=0; 
     for (idx=0;id < len;idx++) 
     {  
      if (startStr.charAt(idx) != endStr.charAt(idx)) 
      { 
       Log.d(TAG,"breaking at idx "+ idx); 
       break; 
      } 
     } 
     filterString=endStr.substring(0,idx).replace("T", " ").replace(":","."); 
     Log.d(TAG,"Filter String" + filterString); 

     String[] children = dir.list(new JpegFilter()); 
     List matchedFiles = new ArrayList(); 
     Log.d(TAG,dir.getAbsolutePath()+" has "+ children.length+ " files"); 
     int numfiles = children.length; 
     for(int i=0;i < numfiles;i++) 
     { 
      //Get file modify time 
      File file = new File(picPath+File.separator+children[i]); 
      // Get the last modification information. 
      long lastModified = file.lastModified(); 
      if (lastModified > =startTime.toMillis(false)) //If file modified date greater than equals start time 
      { 
       Log.d(TAG,"Match! " + children[i]); 
       if (lastModified < =endTime.toMillis(false))//If file modified date less than equals end time 
       { 
        matchedFiles.add(picPath+File.separator+children[i]); 
       } 
       else //We are now over the time range, quit loop to save time 
       { 
        break; //TODO break out of for loop 
       } 
      } 
     } 
     if (!matchedFiles.isEmpty()) //If there are images to be processed 
     { 
      status=convertToPDF(matchedFiles,pdfFile); 
      Log.d(TAG,"convertToPDF() returned " + status); 
     } 

     return status; 
    } 

Это класс фильтра Я использую


class JpegFilter implements FilenameFilter { 
    public boolean accept(File dir, String name) { 
     return (name.startsWith(captureJPEG.filterString) && name.endsWith(".jpg")); 
    } 
} 

ответ

0

Вы взглянули на примере браузера Файл Android написан here? Возможно, вы можете использовать этот пример и настроить его для своих конкретных потребностей. Я не уверен, что это быстрее, но это хорошая отправная точка для рассмотрения альтернативного подхода к вашей цели.

+0

Я буду смотреть на него, но и все приложения браузера файлов будет немного более убить. Позвольте мне посмотреть, есть ли какие-нибудь трюки, которые я могу найти там. – SidJ

1

См http://androidworkz.com/2010/07/08/source-code-find-files-by-type-play-media-file/

public class FileUtils { 

public File[] listFilesAsArray(File directory, FilenameFilter[] filter, 
     int recurse) { 
    Collection<File> files = listFiles(directory, filter, recurse); 

    File[] arr = new File[files.size()]; 
    return files.toArray(arr); 
} 

public Collection<File> listFiles(File directory, 
     FilenameFilter[] filter, int recurse) { 

    Vector<File> files = new Vector<File>(); 

    File[] entries = directory.listFiles(); 

    if (entries != null) { 
     for (File entry : entries) { 
      for (FilenameFilter filefilter : filter) { 
       if (filter == null 
         || filefilter 
           .accept(directory, entry.getName())) { 
        files.add(entry); 
        Log.v("FileUtils", "Added: " 
          + entry.getName()); 
       } 
      } 
      if ((recurse <= -1) || (recurse > 0 && entry.isDirectory())) { 
       recurse--; 
       files.addAll(listFiles(entry, filter, recurse)); 
       recurse++; 
      } 
     } 
    } 
    return files; 
} 

}