gpt4 book ai didi

java - 在Java中递归添加文件-速度问题

转载 作者:行者123 更新时间:2023-12-01 19:22:37 25 4
gpt4 key购买 nike

首先 - 我还没有太多的 Java 经验,而且在 Android SDK 方面我还是个初学者。

我正在尝试编写一个音乐播放器应用程序,该应用程序启动时会扫描整个 SD 卡中的 mp3 文件。

目前我正在这样做:

// Recursively add songs in a directory
public void addSongsInDirectory(File dir, String filter) {
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
if (f.isDirectory()) {
addSongsInDirectory(f, filter);
} else {
// Create new MimetypesFileTypeMap
MimetypesFileTypeMap mtfm = new MimetypesFileTypeMap();
// Add the mp3 mimetype
mtfm.addMimeTypes("audio/mpeg mp3");

// If current song is audio/mpeg, add it to the list
if (mtfm.getContentType(f).equals(filter)) {
songs.add(f.getName());
}
}
}
}
}

不幸的是,在我的手机上有很多歌曲,这个过程大约需要 30 秒。我怎样才能优化这个函数,使其运行得更快(并且可能在后台运行)?

最佳答案

Android 特定的优化是在目录中查找名为 .nomedia 的文件。这表明该目录的任何子目录中都没有媒体文件。这个想法是,应用程序可以在其数据目录中创建一个 .nomedia 文件,以告诉媒体应用程序无需扫描它们,因为其中没有媒体(或者可能存在仅使用的媒体文件)由应用程序内部执行,例如游戏中的音乐)。

或者,您可以跳过编写自己的扫描仪并使用 Android 内置的媒体扫描仪。这只是一个querying the appropriate ContentProvider的问题。

您的代码将如下所示:

String[] projection = new String[] {
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.TITLE
};

Cursor cursor = managedQuery(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, //URI
projection, //columns to return
null, //rows to return - all
null, //selection arguments - none
null // sort order - default
);

cursor.moveToFirst();

while(! cursor.isLast()) {
Log.d("MediaTest","Found track:");
Log.d("MediaTest","Album " + cursor.getString(0));
Log.d("MediaTest","Artist " + cursor.getString(1));
Log.d("MediaTest","Track " + cursor.getString(2));
cursor.moveToNext();
}

关于java - 在Java中递归添加文件-速度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3289649/

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