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

标签 java android

我想过滤手机中存储的扩展名为 .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);
    }
}

关于java - 如何过滤sdcard中带有apk扩展名的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38788193/

相关文章:

Java - 解释gridbag权重显示像素关系/公式/转换

java - 我的关于简单字符串显示的代码没有显示所需的输出?

java - 发布 google app java web 应用程序时获取无效的运行时

android - FCM token 何时到期?

android - GCM 发送图像而不是消息

java - Android Studio音板: How to start a loop with a mediaplayer button?

java - 从 SUMO 模拟获取实时汽车数据到 java

java - 需要泛型转换解释

javascript - 我可以在cordova应用程序中将配置从config.xml写入AndroidManifest.xml吗

java - 从 android 中的服务接收广播时出现 NULL 对象引用错误