2013-03-17 2 views
2

Я использую метод Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC), чтобы получить каталог по умолчанию, на котором мое устройство Android сохраняет свою музыку.Внешнее хранилище Android

Каталог, возвращаемый этим методом, существует (что-то вроде sdcard/music), но у него нет музыкальных файлов. Когда я проверил свою SD-карту, я обнаружил, что все музыкальные файлы вместо этого хранятся в другом каталоге, названном одним из моих приложений (sdcard/qqmusic/song), который не может быть найден с помощью метода getExternalStoragePublicDirectory.

В таком случае (разные устройства хранят музыку в разных местах), есть ли какие-либо хорошие способы получить пути независимо от различий между устройствами?

+0

Уместно сообщить пользователю, где находятся эти музыкальные файлы. – StarPinkER

+0

Я думаю, что большинство пользователей не заботятся о том, где их устройства сохраняют музыкальные файлы. – Allen

+0

Но, очевидно, что музыка загружается qqmusic, которая является популярным приложением в Китае. И этот каталог создается этим приложением. – StarPinkER

ответ

0

Как мы говорили в комментариях, я покажу, как приложение Android Music находит все музыкальные файлы.

Приложение Android Music просто запрашивает MediaProvider, чтобы получить все музыкальные материалы на внешнем хранилище, то есть на SD-карте.

И базы данных заполнены 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 означает SD-карту в целом, а метод scan (...) вызывает метод scanDirectory в MediaScanner, я разместил исходный код MediaScanner, вы можете взглянуть на него. @Allen – StarPinkER

Смежные вопросы