Как отфильтровать только соответствующие мультимедийные файлы в Android?
Я пытаюсь извлечь все музыкальные файлы в свой телефон:
Для этого я использую:
String[] STAR = {"*"};
Uri allExternalSongUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String selection = MediaStore.Audio.Media.IS_MUSIC + " != 0";
Cursor cursor = getContentResolver().query(allExternalSongUri, STAR, selection, null, null);
if(cursor != null){
if(cursor.moveToFirst()){
do {
String songName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME));
Log.i("name", songName);
} while (cursor.moveToNext());
}
cursor.close();
}
Но выше код, помимо получения музыкальных файлов, также извлекает некоторые дополнительные ненужные файлы, такие как * sound_screen_on.mp3 * (который установлен и используется каким-либо другим приложением).
Проблема заключается в том, что мой родной андроид не перечисляет и не воспроизводит эти ненужные файлы.
Как я могу фильтровать такие файлы.
Ответы
Ответ 1
Вы можете фильтровать с помощью MediaStore.Audio.AudioColumns class. Это вернет много значения аудиофайла, и вы сможете его использовать.
musiccursor = managedQuery(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
proj, MediaStore.Audio.Media.DURATION + ">= 60000", null, null);
- Фильтр Duration - Продолжительность звукового файла в ms
- Фильтр Тип-музыка -Не-ноль, если аудиофайл - это музыка
- Фильтр Type-RingTone - ненулевой, если звуковой файл может быть рингтоном
- Фильтр Тип-Тревога - Без нуля, если звуковой файл может быть аварийным сигналом
Проверить дополнительную ссылку
Ответ 2
Помимо вышеуказанных методов, предложенных другими, в случае, когда столбец не является надежным из db, вы всегда можете использовать MediaMetadataRetriever для получения необходимой вам информации после первой фильтрации из db.
http://developer.android.com/reference/android/media/MediaMetadataRetriever.html
Это, конечно, медленнее, чем получение существующей информации из средств массовой информации db, но она даст вам информацию об авторе/альбоме/длительности и т.д. и вы можете сделать как настраиваемый фильтр, как вы можете получить список файлов, который вы получаете из Поставщик услуг.
Ответ 3
Используя тот же код, я не получаю никакого нежелательного файла.
Обычно эти файлы отмечены как игнорируемые, поэтому, возможно, медиа-сканер сделал что-то неправильно или индекс не обновлен в вашей системе.
Звуки, изображения и другие мультимедийные файлы, предназначенные для использования одним приложением или системой, помечены как игнорируемые просто добавлением файла с именем ".nomedia" в тот же каталог. Как вы можете прочитать в документах поставщика MediaStore
public static final String MEDIA_IGNORE_FILENAME
Добавлен в уровень API 9 Имя файла, сигнализирующего медиа-сканера игнорировать носитель в каталоге и его подкаталогах. Разработчики должны использовать это, чтобы избежать появления графиков приложений Галерея, а также предотвращать звуки приложений и музыку от отображается в приложении "Музыка".
Постоянное значение: ".nomedia"
Итак, помимо советов из chintan khetiya, это здорово, возможно, вы можете подумать, что есть некоторые файлы, отмеченные как игнорируемые, которые на самом деле не игнорируются и проверяют их самостоятельно.
Просто, когда вы итерации курсора, для каждого файла, просто проверьте, есть ли в том же каталоге файл, называемый значением MediaStore.MEDIA_IGNORE_FILENAME
или жестко закодированным .nomedia
Ответ 4
только получить музыку, которая _data больше определенного значения, например 300kb.