MediaPlayer требует, чтобы воспроизводимый файл имел права на чтение для всех.Вы можете просмотреть права доступа к файлу с помощью следующей команды в оболочке adb:
ls -al /data/data/com.mypackage/myfile
Вы, вероятно, увидите «-rw ------», что означает, что только владелец (ваше приложение,не MediaPlayer) имеет права на чтение / запись.
Примечание. Чтобы использовать команду ls без указания файла (во внутренней памяти), ваш телефон должен быть рутован.
Если ваш телефонroot, вы можете добавить права на чтение в оболочке adb с помощью следующей команды:
chmod o+r /data/data/com.mypackage/myfile
Если вам нужно программно изменить эти разрешения (требуется рутированный телефон!), вы можете использовать следующую команду в своем приложениикод:
Runtime.getRuntime().exec("chmod o+r /data/data/com.mypackage/myfile");
или
Runtime.getRuntime().exec("chmod 777 /data/data/com.mypackage/myfile");
В основном это команда linux.См. https://help.ubuntu.com/community/FilePermissions для получения дополнительной информации о chmod.
РЕДАКТИРОВАТЬ: нашел другой простой подход здесь (полезно для тех, у кого нет рутованных телефонов).Поскольку приложению принадлежит файл, оно может создать дескриптор файла и передать его в mediaPlayer.setDataSource ():
FileInputStream fileInputStream = new FileInputStream("/data/data/com.mypackage/myfile");
mediaPlayer.setDataSource(fileInputStream.getFD());
Этот подход полностью исключает проблему с разрешениями.