2010-07-20 3 views
0

먼저 - Java에 대한 많은 경험이 없었으며 Android SDK에 관해서는 초보자입니다.Java에서 파일을 재귀 적으로 추가 - 속도 문제

저는 음악 플레이어 앱을 작성하려고합니다. 시작했을 때 mp3 파일을 위해 전체 SD 카드를 검색합니다.

현재이 내가 그 일을 해요 방법은 다음과 같습니다

// 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

어떤 노래 :

코드를 다음과 같이 보일 것인가? 그 Justin Bieber라면 그냥 삭제할 것입니다. – krock

+1

krock : 문제 해결 방법에 대해 감사드립니다. 그것은 필터 규칙과 블랙리스트가 무엇을위한 것인지 ... –

답변

3

Android 전용 최적화는 디렉토리에 .nomedia이라는 파일을 찾는 것입니다. 이것은 하위 디렉토리의 디렉토리에 미디어 파일이 없음을 나타냅니다. 아이디어는 응용 프로그램이 데이터 디렉토리에 .nomedia 파일을 만들어 미디어 응용 프로그램에 미디어가 없기 때문에 스캔 할 필요가 없다는 것을 미디어 응용 프로그램에 알릴 수 있습니다 (또는 음악과 같이 응용 프로그램에서 내부적으로 만 사용되는 미디어 파일이있을 수 있음) 게임에서).

또는 스캐너를 쓰지 않고 Android에 내장 된 Media Scanner를 사용할 수 있습니다. 단순히 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(); 
} 
+0

힌트를 보내 주셔서 감사합니다. –

+0

편집 해 주셔서 감사합니다. ID3 태그를 읽는 문제도 해결할 수 있습니다. :) –

+0

트리플 코멘트를 사용하여 죄송 합니다만, 이상한 이유로 에뮬레이터에서 SD 카드의 미디어 파일을 찾지 못했습니다. 카드에 있지만 파일 탐색기로 볼 수는 있지만 공식 뮤직 앱에도 표시되지 않습니다. 실제 코드에서는 동일한 코드가 작동합니다. 문제가 무엇인지 알 수 있습니까? –

1

나는 이것이 안드로이드에만 국한된 것인지 모르지만, 다른 뮤직 플레이어가 이것을 어떻게 보았는지를 알 수 있습니다.

앱을 처음 사용할 때 음악 컬렉션의 색인을 생성해야한다는 사실을 사용자에게 알립니다. 사람들은 이것이 시간이 걸릴 것으로 기대합니다.

일단 색인 파일을 저장하면 시작시 색인 파일을 표시 할 수 있습니다. 사용자가 다른 일을하는 동안 백그라운드에서 음악 컬렉션의 색인을 생성합니다. 새 색인 파일이 이전 색인 파일과 다른 경우 저장하십시오.

마지막으로 원하는 경우 언제든지 사용자에게 음악 컬렉션의 색인을 생성 할 수있는 옵션을 제공합니다. 보통, 그가 새로운 노래 또는 2 곡을 추가했다는 것을 알 때입니다.

UI 스레드로부터 분리 된 Java 스레드를 사용하여 색인 파일을 작성합니다.

+0

나는 그것에 대해서도 생각했지만, 기본 음악 플레이어는 파일을 색인화하지 않습니다. SD 카드에 새 파일을 추가하고 뮤직 앱을 열고 거기에 있습니다. 또한 음악 앱의 모든 사용자 데이터를 삭제 한 후에는 520 개의 파일을 모두 나열하는 데 약 5 초 밖에 걸리지 않습니다. 그래서 내가 현재 사용하고있는 것보다 훨씬 더 효율적인 방법이 있어야합니다. –

+0

@ danilo : UI 스레드에서 스레드를 추측하고 있습니다. 잘하면, 더 많은 안드로이드 특정 답변을 얻을거야. –

관련 문제