我想过滤带有.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);
}
}
答案 0 :(得分: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);
}
}
答案 1 :(得分: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;
}