Найти опус файлы на Android - PullRequest
2 голосов
/ 10 марта 2020

С недавних пор я использую формат файла OPUS в моей библиотеке musi c. Даже если Android изначально поддерживает формат файла OPUS , не так много проигрывателей musi c, в которых есть дорожки musi c, закодированные в этом формате.

Я хотел создать свой собственный простой проигрыватель musi c, в котором перечислены аудиодорожки в кодировке OPUS. Однако я не мог понять, как найти файлы в системе.

Лучший способ - использовать запрос / курсор. Однако файлы OPUS просто игнорируются :

Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
                                           null, null, null, null);

System.out.println(cursor.getCount()); //The size of my music library without .opus files

while (cursor.moveToNext()) {
  //.mp3 and .flac files but no .opus files
  System.out.println(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)));
}

Затем я попытался получить доступ к моим файлам musi c вручную, но безуспешно:

File musicDirectory = new File(getExternalFilesDir(Environment.DIRECTORY_MUSIC).toURI());
//This directory seems to be empty, length: 0
System.out.println(musicDirectory.list().length);

И:

File file = new File(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI.getPath());
//Exists: false
System.out.println(file.exists());

Кто-нибудь знает, в чем проблема, или знает какие-нибудь обходные пути? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 10 марта 2020

Лучше всего использовать запрос / курсор. Однако файлы OPUS просто игнорируются

Если ваши файлы Opus имеют тот же винтаж, что и файлы MP3 и FLA C (т.е. они долгое время находились на вашем тестовом устройстве), то MediaStore может не знать, как автоматически их проиндексировать.

Затем я попытался получить доступ к моим файлам musi c вручную, но безуспешно:

Здесь мало проблем :

  • Конструктор File и toURI() бессмысленны, так как getExternalFilesDir() возвращает File
  • , который File указывает на спецификацию вашего приложения c часть внешнего хранилища , поэтому, если ваши файлы Opus отсутствуют, этот File не будет перечислять их
  • Если вы хотите переключиться в каталог musi c уровня устройства ( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)), который недоступен для Android 10 и выше

И:

A Uri не является файлом. Вызывать getPath() на Uri, чья схема отличается от file, бессмысленно, а схема для MediaStore.Audio.Media.EXTERNAL_CONTENT_URI равна content

, знаете какие-нибудь обходные пути?

Вы можете попробовать запрос MediaStore, но:

  • Ограничение на основе типа MIME и
  • Использование MediaStore.Files вместо MediaStore.Audio

Это также не будет работать на Android 10 и выше, но если бы это работало, это было бы быстрее, чем сканировать дерево каталогов musi c самостоятельно.

И если MediaStore.Audio не начнет индексирование Файлы Opus, отличного решения для вас нет на Android 10 и выше. Лучше всего было бы ACTION_OPEN_DOCUMENT_TREE, чтобы пользователь мог указать вам на дерево документов, содержащее файлы Opus, и вы бы отсканировали это дерево для документов с типом Opus MIME. Это может сработать, но может быть и медленным.

...