Getting list of all files of a specific type

后端 未结 5 937
礼貌的吻别
礼貌的吻别 2020-12-17 21:51

Is there a way to get a list of all files of a specific type from the sdcard? For images, we have Media.Images. Similarly, do we have any such framework below API10?

5条回答
  •  一个人的身影
    2020-12-17 22:27

    This is my FileFilter for audio files (you can change the extension list for your scenario).

    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 subDirs = new ArrayList();
                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;
            }
        }
    
    }
    

    You have to use a FileFilter to get a filtered list of files and dir from a dir in this way:

    File[] files = dir.listFiles(new AudioFileFilter());
    

提交回复
热议问题