gpt4 book ai didi

Android 按文件夹列出音乐并播放

转载 作者:行者123 更新时间:2023-11-29 00:38:49 25 4
gpt4 key购买 nike

我正在为市场上已经上市的安卓开发音乐播放器。用户要求添加文件夹 View 以列出其智能手机中包含音乐的所有文件夹,我想开发它。

MediaStore 已经知道哪些是正确的路径(因为它需要知道它们才能每次重新扫描 sdcard)所以我想知道是否有办法获取这些路径并使用它们向用户。

获取这些路径的另一个选项(但我不喜欢它)是查询 MediaStore 以获取库中的所有音乐并在它们上循环以获取公共(public)基本路径。但如果用户拥有超过 1/2k 的音乐,这将是一种庞大且未优化的方式。

你知道我该如何解决吗?

我也在考虑列出 SD 卡中的所有文件夹和文件,但我遇到了一些递归问题,因为我不想显示:

  • 不是音频文件(已使用 FileFilter 完成)
  • 不显示空文件夹(已经完成但存在递归问题)
  • 不显示带有 .nomedia 文件的文件夹(这告诉我没有任何媒体文件,但存在递归问题)。其他应用程序创建的许多文件夹也没有放置 .nomedia 文件,所以我必须展示它们

你怎么看这件事?

更新:我想做的是这样的:https://play.google.com/store/apps/details?id=cyberniko.musicFolderPlayer我想显示有一些音乐的文件夹,并允许用户开始播放所选文件夹中的音乐。

最佳答案

如我所说,一个可能的解决方案是使用我编写的这个 FileFilter 开始扫描 SDCard 中的所有目录:

此 AudioFilter 应用于一个目录,该目录返回所有是歌曲的文件(检查扩展名)和所有包含歌曲但不包含 .nomedia 的目录

无论如何,这个解决方案需要被跳过,因为加载目录列表花费的时间太长(因为递归算法)

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;
}
}

}

关于Android 按文件夹列出音乐并播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10894576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com