Как отфильтровать только соответствующие мультимедийные файлы в 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.