我正在尝试为 Nexus 7 平板电脑创建音乐播放器应用。我能够从特定目录中检索音乐文件以及与它们相关的信息,例如标题、艺术家等。我已将文件的标题加载到可单击的列表视图中。当用户点击一个标题时,它会将他们带到一个播放相关歌曲的活动。我试图按字母顺序对标题进行排序,但遇到了障碍。当我只对标题进行排序时,它们不再与正确的歌曲匹配。这是意料之中的,因为我只订购了标题而不是实际文件。我试图通过这样做来修改排序算法:
//will probably only work for Nexus 7
private final static File fileList = new File("/storage/emulated/0/Music/");
private final static File fileNames[] = fileList.listFiles(); //get list of files
public static void sortFiles()
{
int j;
boolean flag = true;
File temp;
MediaMetadataRetriever titleMMR = new MediaMetadataRetriever();
MediaMetadataRetriever titleMMR2 = new MediaMetadataRetriever();
while(flag)
{
flag = false;
for(j = 0; j < fileNames.length - 1; j++)
{
titleMMR.setDataSource(fileNames[j].toString());
titleMMR2.setDataSource(fileNames[j+1].toString());
if(titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE).compareToIgnoreCase(titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)) > 0)
{
temp = fileNames[j];
fileNames[j] = fileNames[j+1]; // swapping
fileNames[j+1] = temp;
flag = true;
}//end if
}//end for
}//end while
}
这应该从两个文件中检索歌曲标题,比较它们,如果第一个按字母顺序排在第二个之后,则交换 File 数组中的文件。出于某种原因,当我运行调用此方法的活动时,应用程序崩溃了。如果我从titleMMR2的数据源
中删除+ 1titleMMR2.setDataSource(fileNames[j].toString());
该应用程序不再崩溃,但列表不按顺序排列。这也是可以理解的,因为它会将歌曲名称与它们自己进行比较。我不知道为什么+ 1会使程序崩溃。它不是数组越界错误。该目录中共有 6 个 .mp3 文件,它们是该目录中唯一的文件。我也尝试过使用Arrays.sort(fileNames)
,但仅按文件名而不是歌曲名称对它们进行排序。我也试过这个:
Arrays.sort(fileNames, new Comparator<File>(){
public int compare(File f1, File f2)
{
titleMMR.setDataSource(f1.toString());
titleMMR2.setDataSource(f2.toString());
return titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE).compareToIgnoreCase(titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE));
} });
该片段也导致了崩溃。Java 代码中没有错误,并且所有适当的类都已导入。我真的不知道出了什么问题。任何帮助将不胜感激,如果需要任何新信息,我将很乐意提供。提前致谢。
固定的
正确的代码片段是这样的:
public static void sortFiles()
{
int j;
boolean flag = true;
File temp;
MediaMetadataRetriever titleMMR = new MediaMetadataRetriever();
MediaMetadataRetriever titleMMR2 = new MediaMetadataRetriever();
while(flag)
{
flag = false;
for(j = 0; j < fileNames.length - 1; j++)
{
titleMMR.setDataSource(fileNames[j].toString());
titleMMR2.setDataSource(fileNames[j+1].toString());
String title1;
String title2;
if(titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null)
title1 = fileNames[j].getName();
else
title1 = titleMMR.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
if(titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE) == null)
title2 = fileNames[j+1].getName();
else
title2= titleMMR2.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
if(title1.compareToIgnoreCase(title2) > 0)
{
temp = fileNames[j];
fileNames[j] = fileNames[j+1]; // swapping
fileNames[j+1] = temp;
flag = true;
}//end if
}//end for
}//end while
}