Я в процессе обновления моего приложения для использования правильного ввода-вывода на основе URI, и у меня возникли некоторые проблемы с Uris, полученным из Android MediaStore.
По сути, мое приложение позволяет пользователю выбрать песню из Media Store. Затем я открываю для этого файла только для чтения AssetFileDescriptor
, который затем использую для чтения файла. Это работает отлично по большей части; тем не менее, я все еще получаю значительное количество отчетов о сбоях от пользователей. В этой строке выдается исключение:
AssetFileDescriptor des = contentResolver.openAssetFileDescriptor(uri, "r");
Трассировка стека выглядит следующим образом:
java.io.FileNotFoundException: No entry for content://media/external/audio/media/[ID]
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:144)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:698)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1473)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1310)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1233)
Я уверен, что URI действителен, поскольку он извлекается непосредственно из MediaStore. Кажется, что исключение говорит, что нет никакого файла, на который указывает uri, но то, что сбивает с толку, - то, почему эта запись в MediaStore существует, если она не поддерживается каким-либо файлом.
Я искал и нашел очень мало документации, связанной с сообщением No entry for content
. (В основном случайные ТАК вопросы с несколькими полезными ответами.) Буду признателен, если кто-нибудь сможет объяснить, почему это происходит.
Если решение невозможно, могу ли я узнать, какие записи MediaStore не поддерживаются файлом, не открывая их? Кажется плохим UX даже показывать эти песни пользователю, если они не могут быть открыты приложением.
Заранее спасибо.