9

有没有办法从 sdcard 中获取特定类型的所有文件的列表?对于图像,我们有 Media.Images。同样,API10以下我们有这样的框架吗?

4

5 回答 5

16

这是我的音频文件 FileFilter(您可以更改您的场景的扩展名列表)。

package com.designfuture.music.util;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.util.ArrayList;

import com.designfuture.framework.util.LogHelper;

public class AudioFileFilter implements FileFilter {

    protected static final String TAG = "AudioFileFilter";
    /**
     * allows Directories
     */
    private final boolean allowDirectories;

    public AudioFileFilter( boolean allowDirectories) {
        this.allowDirectories = allowDirectories;
    }

    public AudioFileFilter() {
        this(true);
    }

    @Override
    public boolean accept(File f) {
        if ( f.isHidden() || !f.canRead() ) {
            return false;
        }

        if ( f.isDirectory() ) {
            return checkDirectory( f );
        }
        return checkFileExtension( f );
    }

    private boolean checkFileExtension( File f ) {
        String ext = getFileExtension(f);
        if ( ext == null) return false;
        try {
            if ( SupportedFileFormat.valueOf(ext.toUpperCase()) != null ) {
                return true;
            }
        } catch(IllegalArgumentException e) {
            //Not known enum value
            return false;    
        }
        return false; 
    }

    private boolean checkDirectory( File dir ) {
        if ( !allowDirectories ) {
            return false;
        } else {
            final ArrayList<File> subDirs = new ArrayList<File>();
            int songNumb = dir.listFiles( new FileFilter() {

                @Override
                public boolean accept(File file) {
                    if ( file.isFile() ) {
                        if ( file.getName().equals( ".nomedia" ) )
                            return false;

                        return checkFileExtension( file );
                    } else if ( file.isDirectory() ){
                        subDirs.add( file );
                        return false;
                    } else
                        return false;
                }
            } ).length;

            if ( songNumb > 0 ) {
                LogHelper.i(TAG, "checkDirectory: dir " + dir.toString() + " return true con songNumb -> " + songNumb );
                return true;
            }

            for( File subDir: subDirs ) {
                if ( checkDirectory( subDir ) ) {
                    LogHelper.i(TAG, "checkDirectory [for]: subDir " + subDir.toString() + " return true" );
                    return true;
                }
            }
            return false;
        }       
    }

    private boolean checkFileExtension( String fileName ) {
        String ext = getFileExtension(fileName);
        if ( ext == null) return false;
        try {
            if ( SupportedFileFormat.valueOf(ext.toUpperCase()) != null ) {
                return true;
            }
        } catch(IllegalArgumentException e) {
            //Not known enum value
            return false;    
        }
        return false; 
    }

    public String getFileExtension( File f ) {
        return getFileExtension( f.getName() );
    }

    public String getFileExtension( String fileName ) {
        int i = fileName.lastIndexOf('.');
        if (i > 0) {
            return fileName.substring(i+1);
        } else 
            return null;
    }

    /**
     * Files formats currently supported by Library
     */
    public enum SupportedFileFormat
    {
        _3GP("3gp"),
        MP4("mp4"),
        M4A("m4a"),
        AAC("aac"),
        TS("ts"),
        FLAC("flac"),
        MP3("mp3"),
        MID("mid"),
        XMF("xmf"),
        MXMF("mxmf"),
        RTTTL("rtttl"),
        RTX("rtx"),
        OTA("ota"),
        IMY("imy"),
        OGG("ogg"),
        MKV("mkv"),
        WAV("wav");

        private String filesuffix;

        SupportedFileFormat( String filesuffix ) {
            this.filesuffix = filesuffix;
        }

        public String getFilesuffix() {
            return filesuffix;
        }
    }

}

您必须使用 FileFilter 以这种方式从目录中获取过滤的文件和目录列表:

File[] files = dir.listFiles(new AudioFileFilter());
于 2012-06-13T13:30:00.620 回答
6

试试下面的代码。

File dir = new File("path to directory");

String[] names = dir.list(
    new FilenameFilter()
    {
        public boolean accept(File dir, String name)
        {
            return name.endsWith(".your file type");
            // Example
            // return name.endsWith(".mp3");
        }
    });

请注意,返回的字符串只是文件名,它们不包含完整路径。

于 2012-06-13T13:28:01.073 回答
3

获取 SD 卡的路径并将所有文件输入到数组中File

    File[] file = Environment.getExternalStorageDirectory().listFiles();  


    for (File f : file)
    {
       if (f.isFile() && f.getpath().endswith(".something")) { ... do stuff }
    }
于 2012-06-13T13:29:52.763 回答
3

我只是找到了一种更简单的方法来完成这项工作。

如果您要选择图像或视频等常见文件,请使用库。

对于任何其他类型,您可以尝试 apache 的通用 ios 库。

第一的,

dependencies {
    implementation 'commons-io:commons-io:2.5'
}

然后,

val iterator = FileUtils.iterateFiles(
    Environment.getExternalStorageDirectory(),
    FileFilterUtils.suffixFileFilter("pdf"),
    TrueFileFilter.INSTANCE)
while (iterator.hasNext()) {
    val fileINeed = iterator.next()
    // do your job
}

我以挑选 PDF 为例。它将自动处理子字典。所以迭代器包含我设备的所有PDF文件。

它的 API 非常灵活、强大且易于使用。您可以添加许多过滤器或规则来完成您的特定工作 XD

于 2017-10-23T11:26:07.650 回答
1

我知道为时已晚,但以防万一。我会用 kotlin 的方式来做

 val accepted_extention = listOf("mp3", "3gp", "mp4")
 val ROOT_DIR = Environment.getExternalStorageDirectory().absolutePath
 val ANDROID_DIR = File("$ROOT_DIR/Android")
 val DATA_DIR = File("$ROOT_DIR/data")
 File(ROOT_DIR).walk()
               // befor entering this dir check if
               .onEnter{ !it.isHidden // it is not hidden
                         && it != ANDROID_DIR // it is not Android directory
                         && it != DATA_DIR // it is not data directory
                && !File(it, ".nomedia").exists() //there is no .nomedia file inside
               }.filter { accepted_extention.indexOf(it.extension) > -1}// it is of accepted type
               .toList()
于 2019-08-20T18:37:33.510 回答