繁体   English   中英

如何在sdcard中过滤带有apk扩展名的文件?

[英]how to filter a file with apk extension in sdcard?

我想过滤扩展名为.apk的手机中存储的文件。 我试过下面的代码,但它过滤仅在sdcard / file.apk中找到的文件,但我希望它通过搜索sdcard的子目录来过滤文件。

例如,如果sdcard / download / mm.apk中有一个apk文件,则应对其进行过滤;如果sdcard / New Folder / ABC / cc.apk中也有另一个文件,则也应对其进行过滤。

我怎样才能做到这一点? 谢谢您的帮助...

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

您必须递归地执行此操作。 仅检查扩展名是不够的,还必须验证它是否是常规文件,因为我也可以将目录命名为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);
    }
}

这是您可以尝试的多种方式,请不要忘记在清单中添加权限:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM