Я столкнулся с любопытной ошибкой, когда MediaPlayer
не удается открыть файлы, когда их путь передается как String
, но открывается файл в FileInputStream
, преобразовывается в FileDescriptor
и передается работает от FileDescriptor
до MediaPlayer
.
Для уточнения следующий код создает отображаемый журнал. Файл в "<path to file>"
взят из файла расширения, а путь имеет форму /mnt/obb/obb:<number>/<path inside obb>
. Предположим, что переменная String pathToFile
содержит "<path to file>"
.
try {
mMediaPlayer.setDataSource(pathToFile);
} catch (IOException e) {
e.printStackTrace();
}
2020-02-11 15:15:02.365 2113-28289/? E/FileSource: Failed to open file '<path to file>'. (Permission denied)
2020-02-11 15:15:02.365 2113-28289/? E/GenericSource: Failed to create data source!
2020-02-11 15:15:02.365 2113-28288/? D/NuPlayerDriver: notifyListener_l(0xe7021800), (100, 1, -2147483648, -1), loop setting(0, 0)
2020-02-11 15:15:02.365 28144-28286/<our package> E/MediaPlayerNative: error (1, -2147483648)
В приложении эта ошибка видна в аудиоплеере, который не будет реагировать при нажатии на воспроизведение. Вероятно, это связано с тем, что базовая MediaPlayer
не может быть подготовлена из-за этой ошибки.
Любопытно, что когда я изменяю код на следующий, все работает, как ожидалось, и аудиофайл может воспроизводиться:
try (FileInputStream fileInputStream = new FileInputStream(pathToFile)) {
mMediaPlayer.setDataSource(fileInputStream.getFD());
} catch (IOException e) {
e.printStackTrace();
}
Причина, по которой я задаю этот вопрос, заключается в том, что мы также используем VideoView
, где мы сталкиваемся с той же проблемой. Тем не менее, VideoView
не может пройти FileDescriptor
. Это займет всего String
или Uri
, оба из которых приводят к ошибке, показанной в журнале выше.
В чем заключается основная проблема и как ее правильно исправить?