Сбой MediaPlayer с отказом в разрешении при передаче String вместо FileDescriptor - PullRequest
0 голосов
/ 12 февраля 2020

Я столкнулся с любопытной ошибкой, когда 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, оба из которых приводят к ошибке, показанной в журнале выше.

В чем заключается основная проблема и как ее правильно исправить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...