有没有办法从 sdcard 中获取特定类型的所有文件的列表?对于图像,我们有 Media.Images。同样,API10以下我们有这样的框架吗?
问问题
13606 次
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 回答