0

我一直在为 android 开发自己的音乐播放器(学习在 android 中编程)。

我的问题是当应用程序第一次启动时,它要求用户选择一个媒体文件夹来扫描文件。一切都很好,但我的文件夹中有大约 1200 首歌曲,扫描大约需要三分钟才能完成。扫描涉及的步骤是从文件夹中递归获取文件,然后我将每首歌曲的完整路径添加到数组列表中。然后将数组列表中的每个项目添加到数据库中。我添加到数据库的字段是路径、歌曲的标题(我使用 MediaMetadataReader 检索)、艺术家、专辑和唯一 ID。

有没有更好的方法来做到这一点?有什么办法可以优化这个?提前致谢。

编辑:

当我第一次运行任何其他音乐播放器时,它们的库包含我拥有的所有歌曲以及元数据。他们的扫描只需要几秒钟。他们是怎么做到的?我究竟做错了什么?

4

2 回答 2

3

当您的应用程序第一次被分配一个媒体文件夹时,您如何以您正在做的方式遍历所有文件并仅获取路径,

File dir = new File(dirPath);
File[] filelist = dir.listFiles();

然后在同一文件夹中创建具有与您的应用程序关联的唯一名称或 ID 的 XML 文件。

<Songs>
  <song>
   <name></name>
   <thumbnailpath></thumbnailpath>
   <filepath></filepth>
  </song>
</Songs>

下次用户选择任何文件夹时,您会检查是否创建了列出的 xml 文件?如果没有,那么创建并在将来只使用这个到 xml 文件作为你的表的来源。

然而,诀窍是当用户更改媒体时,假设他们添加了新媒体,那么您必须编写一个逻辑来处理它。

在OP的评论之后

好吧,我没有,但谷歌总是在那里哈哈。但我记得要告诉你的另一件事是。让用户创建播放列表会更聪明,没有人喜欢一起浏览 1200 首歌曲,但是将列表分成几个不同的播放列表,这使您的算法更快地遍历少数文件:)

于 2012-04-29T02:36:00.030 回答
1

虽然 Craftero 的回答是正确的,但我建议不要使用 XML 文件来序列化文件系统的内容,而是使用 SQLite 数据库来缓存目录的内容。这将是一个足够灵活的解决方案,您可以安排后台服务偶尔更新数据库以查找新歌曲(或在打开应用程序时手动启动新扫描)。这使您可以两全其美,您可以最初快速显示到目前为止找到的所有内容(应用程序第一次运行时除外),然后使用新的更新数据库(和相应的视图)你找到的文件。请注意,您可能不希望在 Android 数组中保留 1200 首歌曲,这对于应用程序来说似乎是相当多的内存,

于 2012-04-29T02:59:49.297 回答