Java 在所有SD卡中搜索文件

Java 在所有SD卡中搜索文件,java,android,Java,Android,我正在尝试搜索所有SD卡中扩展名为“.apk”的文件。我写过这个方法 public void scan(File file) { mFile = file.listFiles(); if(mFile != null) { for(int i=0;i<mFile.length;i++) { if(mFile[i] != null) { if(mFile[i].isDirectory()) {

我正在尝试搜索所有SD卡中扩展名为“.apk”的文件。我写过这个方法

public void scan(File file) {
    mFile = file.listFiles();

    if(mFile != null) {
        for(int i=0;i<mFile.length;i++) {
            if(mFile[i] != null) {
                if(mFile[i].isDirectory()) {
                    scan(mFile[i]);
                } else {
                    if(mFile[i].getName().endsWith(".apk")) {
                        lista.add(mFile[i].getName());
                    }
                }
            }
        }   
    }

}
问题是,如果我将一些apk文件放入SD卡中,数组列表大小为0,则此方法不会检测到任何apk文件。为什么?我的目标是扫描所有sd卡以搜索.apk文件。

第一次通过dir作为“/下载”存储ur文件的确切位置。 然后通过整个SD卡根路径 像searchAPK(新文件(“/下载”)

和代码尝试

private void searchAPK(File dir){
        File[] files = dir.listFiles();
        Log.i("DIR", "Found " + files.length + " in " + dir.getAbsolutePath());
        for (File file : files) {
            if(file.isFile() && isAPK(file)){
                list.add(file);
                Log.i("APK found", file.getName());
            }else if(file.isDirectory()){
                searchAPK(file.getAbsoluteFile()); 
            }
        }
    }

    private boolean isAPK(File file){
        boolean is = false;
        if(file.getName().endsWith(".apk") || file.getName().endsWith(".APK")){
            is = true;
        }
        return is;
    }
File[]files=dir.listFiles()


在您的情况下,文件应该是本地数组

使
mFile
成为扫描的本地变量。这是递归工作所必需的。

因为
mFile
是一个字段,对
scan
的每次调用都不会得到自己的
mFile
的“副本”

调用scan(“/sdcard”)时会发生以下情况:(我假装参数是filename而不是
文件
,只是为了简化这个解释)

  • 输入扫描(“/SD卡”)
  • 扫描(“/sdcard”)将mFile设置为/sdcard中的文件列表。说{/sdcard/folder1“,“/sdcard/folder2”}
  • scan(“/sdcard”)调用scan(“/sdcard/folder1”),因为它是mFile中的第一个元素
  • 扫描(“/sdcard/folder1”)将mFile设置为/sdcard/folder1中的文件列表。说没有

  • scan(“/sdcard/folder1”)返回,因为mFile.length是0,k是0,0代码中不需要这一行:

    if(mFile[i] != null) {    
    
    试试这个:

    public void scan(File file) {
    mFile = file.listFiles();
    
    if(mFile != null) {
        for(int i=0;i<mFile.length;i++) {
                if(mFile[i].isDirectory()) {
                    scan(mFile[i]);
                } else {
                    if(mFile[i].getName().endsWith(".apk")) {
                        lista.add(mFile[i].getName());
                    }
                }
            }
        }   
    }
    
    公共作废扫描(文件){
    mFile=file.listFiles();
    如果(mFile!=null){
    
    对于(int i=0;iMost用户在该位置将不会有.apk文件。您的案例中有吗?我的apk文件在/Download文件夹中。请提供完整路径。
    mFile=file.listFiles();
    。在该语句之后,检查mFile是否为null,如果为null,则返回。
    if(mFile[i]!=null)
    。这将永远不会为空。因此您可以删除它。请在此处调整您的代码。您没有在logcat中提到的异常?已经尝试过并且从不为空。那么您可能没有看到我在几分钟前给出了解决方案?
    public void scan(File file) {
    mFile = file.listFiles();
    
    if(mFile != null) {
        for(int i=0;i<mFile.length;i++) {
                if(mFile[i].isDirectory()) {
                    scan(mFile[i]);
                } else {
                    if(mFile[i].getName().endsWith(".apk")) {
                        lista.add(mFile[i].getName());
                    }
                }
            }
        }   
    }