2013-03-17 2 views
2

Android 기기에서 음악을 저장하는 기본 디렉토리를 얻으려면 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) 메소드를 사용하고 있습니다.Android 외부 저장

이 방법으로 반환 된 디렉토리가 존재하지만 (sdcard/music과 비슷 함) 음악 파일이 없습니다. 내 sdcard를 확인할 때 모든 음악 파일이 getExternalStoragePublicDirectory 메서드를 사용하여 찾을 수없는 내 응용 프로그램 (sdcard/qqmusic/song) 중 하나에 의해 명명 된 다른 디렉토리에 저장된다는 것을 알았습니다.

이러한 경우 (다른 장치가 다른 위치에 음악을 저장함) 장치 간의 차이에 관계없이 경로를 가져 오는 좋은 방법이 있습니까?

+0

사용자가 음악 파일의 위치를 ​​알려주는 것이 좋습니다. – StarPinkER

+0

대부분의 사용자는 기기가 음악 파일을 저장하는 위치를 신경 쓰지 않을 것이라고 생각합니다. – Allen

+0

하지만 분명히 음악은 중국에서 인기있는 앱인 qqmusic에서 다운로드합니다. 그리고 그 디렉토리는 해당 애플리케이션에 의해 생성됩니다. – StarPinkER

답변

0

댓글에서 설명한 것처럼 Android Music 애플리케이션이 모든 음악 파일을 찾는 방법을 보여 드리겠습니다.

Android Music 애플리케이션은 MediaProvider에 외부 저장 공간 (예 : sdcard)에 대한 모든 음악을 가져 오기만하면됩니다.

그리고 데이터베이스는 MediaScannerService으로 채워집니다. MediaScannerService는 MediaScanner.scanDirectories을 호출하여 해당 디렉토리 아래의 모든 파일을 검색합니다. 오디오 파일 인 경우 메타 데이터를 가져 와서 데이터베이스에 저장합니다 (MediaProvider).

if (MediaProvider.INTERNAL_VOLUME.equals(volume)) { 
    // scan internal media storage 
    directories = new String[] { 
     Environment.getRootDirectory() + "/media", 
    }; 
}else if (MediaProvider.EXTERNAL_VOLUME.equals(volume)) { 
    // scan external storage volumes 
    directories = mExternalStoragePaths; 
} 

if (directories != null) { 
    scan(directories, volume); 
} 

그래서 내 대답은 MediaProvider 이미 외부 저장 장치에있는 음악 파일이 포함되어 있습니다, 그래서 당신은 직접 모든 음악 파일을 얻을 수있는 업체를 조회 할 수 있습니다.

먼저 MediaStore을 확인하십시오.

다음 코드를 사용하여 모든 음악 파일을 가져올 수 있습니다.

//Some audio may be explicitly marked as not being music 
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0"; 

String[] projection = { 
     MediaStore.Audio.Media._ID, 
     MediaStore.Audio.Media.ARTIST, 
     MediaStore.Audio.Media.TITLE, 
     MediaStore.Audio.Media.DATA, 
     MediaStore.Audio.Media.DISPLAY_NAME, 
     MediaStore.Audio.Media.DURATION 
}; 

cursor = this.managedQuery(
     MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, 
     projection, 
     selection, 
     null, 
     null); 

private List<String> songs = new ArrayList<String>(); 
    while(cursor.moveToNext()){ 
     songs.add(cursor.getString(0) + "||" + cursor.getString(1) + "||" + cursor.getString(2) + "||" + cursor.getString(3) + "||" + cursor.getString(4) + "||" + cursor.getString(5)); 
} 

MediaStore.Audio.Media.DATA 열은 음악 파일의 전체 경로를 포함합니다.

+0

커서 부분을 인식 할 수 있지만 MediaProvider 부분이 나를 혼란스럽게합니다. 좀 자세히 설명해 주시겠습니까? – Allen

+0

EXTERNAL_VOLUME은 일반적으로 sdcard를 의미하며 scan (...) 메서드는 MediaScanner의 scanDirectory 메서드를 호출합니다. MediaScanner의 소스 코드를 게시했습니다.이 샘플을 살펴볼 수 있습니다. @ 앨런 – StarPinkER

관련 문제