2016-08-05 8 views
0

拡張子が.apkの携帯電話に保存されているファイルをフィルタ処理したいとします。私は以下のコードを試してみましたが、ファイルはのsdcard/file.apk にしか見つかりませんが、sdcardのサブディレクトリも検索してファイルをフィルタします。sdcardのapk拡張子を持つファイルをフィルタリングする方法は?

例えばSDカード/ダウンロード/ mm.apk内部のapkファイルがある場合はそれをフィルタリングする必要があり、また、SDカード/新規フォルダ/ ABC/cc.apk内の別のファイルがある場合は、それをフィルタリングする必要がありますあまりにも。

どうすればいいですか?これは、あなたが試すことができ、多くの方法で、1である

ExtFilter apkFilter = new ExtFilter("apk"); 
      File file[] =Environment.getExternalStorageDirectory().listFiles(apkFilter); 
      Log.i("InstallApk","Filter applied. Size: "+ file.length); 
      for (int i=0; i < file.length; i++) 
       { 
        Log.i("InstallApk", 
          "FileName:" + file[i].getName()); 
       } 
      ArrayAdapter af=new ArrayAdapter<File>(this,android.R.layout.simple_list_item_1,android.R.id.text1,file); 
      ListView ll=(ListView) findViewById(R.id.mainListView1); 
      ll.setAdapter(af); 
     } 
    class ExtFilter implements 
    FilenameFilter {  
    String ext;   
    public ExtFilter(String ext) {  
    this.ext = "." + ext;   
    }  
    public boolean accept(File dir, String name) 
    {    
    return name.endsWith(ext);  
    } 
     } 

答えて

0

...あなたの助けをありがとう、マニフェストにパーミッションを追加することを忘れないでください:

private List<String> ReadSDCard() 
{ 
    File f = new File("your path"); // Environment.getExternalStorageDirectory() 

    File[] files=f.listFiles(); 

    for(int i=0; i<files.length; i++) 
    { 
     File file = files[i]; 
     String filePath = file.getPath(); 
     if(filePath.endsWith(".apk")) 
     tFileList.add(filePath); 
    } 
return tFileList; 
} 
+0

私は@Huy Nそれを試してみましたが、それは唯一のSDカード/のみで見つかったのAPKをフィルタリングが、私は携帯電話のファイルシステムで見つかった短期のAPKでSDカードフォルダ全体で見つかったのAPKをフィルタリングします。 – surayanbo

+0

@surayanboこの記事はあなたに役立つかもしれません:http://stackoverflow.com/questions/8307034/how-to-get-the-apk-file-of-an-application-programatically – alway5dotcom

1

あなたは再帰的にそれをしなければなりません。拡張子を確認するだけでは十分ではありません。また、ディレクトリ名をdir.apkとすれば、通常のファイルであることを確認する必要があります。それが正規のファイルであることを確認することは、拡張子の付いたファイルに名前を付けることができるため、十分ではありません。それにかかわらず、通常のファイルであることを確認するには、これらのファイルに対する意図されたアクションを考慮せずに十分でなければなりません。

public void someFunction() { 
    List<File> apkFiles = getApkFiles(Environment.getExternalStorageDirectory(), new ApkSearchFilter()); 
    File file[] = apkFiles.toArray(new File[apkFiles.size()]); 
    Log.i("InstallApk", "Filter app\"lied. Size: " + file.length); 
    for (File aFile : file) { 
     Log.i("InstallApk", "FileName:" + aFile.getName()); 
    } 
} 

List<File> getApkFiles(File file, ApkSearchFilter filter) { 
    if (filter.isApk(file)) 
     return Collections.singletonList(file); 
    else if (filter.isDirectory(file)) { 
     LinkedList<File> files = new LinkedList<>(); 
     for (File subFile : file.listFiles()) { 
      files.addAll(getApkFiles(subFile, filter)); 
     } 
     return files; 
    } else return Collections.emptyList(); 
} 


class ApkSearchFilter implements FileFilter { 

    boolean isApk(File file) { 
     return !file.isDirectory() && file.getName().matches(".*\\.apk"); 
    } 

    boolean isDirectory(File file) { 
     return file.isDirectory(); 
    } 

    @Override 
    public boolean accept(File file) { 
     return isDirectory(file) || isApk(file); 
    } 
} 
+0

基本的な再帰的な方法。私はちょうどいくつかのサイクルを得るためにパラメータでリストを渡すだろう(addAllは、多くのapkがある場合は時間がかかる可能性があります)。 しかし、私は同じロジックを使ってディレクトリ上のすべてのビデオファイルを見つけ出し、何百人も見つけるのに数秒かかります。 PS:LinkedListを使うと便利でしょうか? – AxelH

+0

@AxelHあなたが正しいです、周りのリストを渡すことがより最適でLinkedListは不要です。私は、Javaのリンクリストがリンクリストを別のリンクリストに追加できることを期待していました。明らかにそうではありません。 – Olayinka

+0

ええ、両方のリストを一緒にフックするLinkedListのaddAllのオーバーロードは、グッドなアイデアですが、残念ですが、コレクション上でループしています。しかし、いい試し;) – AxelH

関連する問題