代码之家  ›  专栏  ›  技术社区  ›  Danilo Bargen

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

  •  0
  • Danilo Bargen  · 技术社区  · 14 年前

    首先-我还没有太多的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秒。如何优化此函数以使其更快地工作(可能在后台)?

    2 回复  |  直到 14 年前
        1
  •  3
  •   David Webb    14 年前

    Android特有的优化是寻找一个名为 .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();
    }
    
        2
  •  1
  •   Gilbert Le Blanc    14 年前

    我不知道这是特定于Android的,但这是我见过的其他音乐播放器处理这个问题的方式。

    最后,您可以让用户随时为自己的音乐收藏编制索引。通常,他知道自己加了一两首新歌。