Привет, я пишу приложение для Android, которое будет воспроизводить набор аудиофайлов, которые я поставляю с помощью приложения, а также позволяю пользователям создавать и воспроизводить собственный звук. Проблема в том, что я не знаю, где хранить файлы. Если я храню их во внешнем (sdcard) месте, я не уверен, как я отправлю эти файлы на внешнее хранилище пользователя при установке моего приложения. Я думал, что мог бы кто-то в активах и обычаях звучать извне.
когда я пытаюсь это сделать, однако я получаю следующую ошибку: java.io.FileNotFoundException: этот файл не может быть открыт как дескриптор файла; он, вероятно, сжат
вот мой код:
try {
Constants.mPlayer = new MediaPlayer();
AssetFileDescriptor afd = this.getApplicationContext().getAssets().openFd("songid.mus");
Constants.mPlayer.setDataSource(afd.getFileDescriptor());
Constants.mPlayer.prepare();
Constants.mPlayer.start();
} catch (Exception e) {
Log.e("", "prepare() failed", e);
}
Любые идеи или предложения?
Спасибо! Радха
В качестве быстрого исправления вы можете избежать сжатия, изменив имя вашего файла на songid.mp3
.
Автор этого сообщения также предлагает передать расширение с опцией -0
в aapt
в командной строке:
Во-первых, вы можете предоставить свой файл активов расширение в списке выше. В то время как это не обязательно имеет смысл, это может быть легко обходным путем, если вы не хотите иметь дело с командная строка. Другой вариант - передать определенное расширение на -0 флаг, например -0 db, для отключения сжатие для активов с расширение. Вы можете передать флаг -0 несколько раз, и каждый раз с отдельное расширение, если вам нужно больше чем один тип для несжатого.
Если вы чувствуете себя авантюристом, вы можете попытаться заменить aapt
на script, который вызывает aapt
с -0 mus
, как в этот пост.
Спасибо Мэтью! Я изменил имя с songid.mus на songid.3gp. Это исправило мое первое исключение. Очень признателен.
После этого я получил еще одно исключение, которое я хочу описать для тех, кто совершает ту же ошибку, что и я.:-) Я получил java.io.IOException: Prepare failed.: status=0x1
Мне потребовалось некоторое время, чтобы понять, что мне нужно добавить начало и продолжительность:
Constants.mPlayer = new MediaPlayer();
AssetFileDescriptor afd = this.getApplicationContext().getAssets().openFd("songid.3gpp");
long start = afd.getStartOffset();
long end = afd.getLength();
Constants.mPlayer.setDataSource(afd.getFileDescriptor(), start,end);
Constants.mPlayer.prepare();
Constants.mPlayer.start();
Это работает! Спасибо!