Android MP3: java.io.FileNotFoundException: этот файл нельзя открыть как дескриптор файла; это вероятно сжато - PullRequest
2 голосов
/ 14 апреля 2011

Я пытаюсь воспроизвести собственный звук res/raw/notification.mp3. Это ~ 91 КБ.

Вот мой код

MediaPlayer.create(context, R.raw.notification).start();

Вот моя ошибка

04-14 15:57:55.387: ERROR/AndroidRuntime(233): android.content.res.Resources$NotFoundException: File res/raw/notification.mp3 from drawable resource ID #0x7f040000
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.content.res.Resources.openRawResourceFd(Resources.java:860)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.media.MediaPlayer.create(MediaPlayer.java:641)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at mypackage.MyActivity$1.onPostExecute(MyActivity.java:123)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.os.AsyncTask.finish(AsyncTask.java:417)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.os.Looper.loop(Looper.java:123)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.app.ActivityThread.main(ActivityThread.java:4627)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at java.lang.reflect.Method.invokeNative(Native Method)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at java.lang.reflect.Method.invoke(Method.java:521)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at dalvik.system.NativeStart.main(Native Method)
04-14 15:57:55.387: ERROR/AndroidRuntime(233): Caused by: java.io.FileNotFoundException: This file can not be opened as a file descriptor; it is probably compressed
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.content.res.AssetManager.openNonAssetFdNative(Native Method)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.content.res.AssetManager.openNonAssetFd(AssetManager.java:426)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     at android.content.res.Resources.openRawResourceFd(Resources.java:857)
04-14 15:57:55.387: ERROR/AndroidRuntime(233):     ... 14 more

То же самое происходит с несвязанным файлом WAV, поэтому, вероятно, это не проблема MP3.

Что может быть не так? Должен ли я распаковать WAV / MP3? Как?

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Оказывается, проблема в сценариях сборки, генерируемых NetBeans. Я сделал учебник с нуля, и он потерпел неудачу в NetBeans и работал в Eclipse. Полагаю, я наконец изучу Eclipse. Это то, что я хотел сделать, по крайней мере, в качестве сравнения в надежде, что это будет менее глючно, но у меня не было времени. Что ж, необходимость сейчас даст мне время.

0 голосов
/ 14 апреля 2011

Что вы передаете для значения контекста?Контекст используется, чтобы знать, где искать файл ресурса.Похоже, вы могли вызвать это внутри AsyncTask?Вы используете getApplicationContext(), чтобы получить ссылку?Например, если бы этот код был внутри Activity, вы бы назвали этот метод следующим образом:

MediaPlayer.create(this, R.raw.notification).start();

Если нет, вам нужно передать соответствующий контекст, который сопоставляется с вашим пакетом приложения.

Другая возможность - ваш R.java устарел.Убедитесь, что в ваших XML-файлах нет ошибок, препятствующих восстановлению ресурсов, и, возможно, запустите очистку проекта.

Еще одна вещь, которую вы можете попробовать, это поместить ваш MP3-файл в каталог assets и попробоватьзагрузить звук таким образом.Для файла, расположенного по адресу assets/notification.mp3:

MediaPlayer mp = new MediaPlayer();
AssetFileDescriptor afd = getAssets().openFd("notification.mp3");
mp.setDataSource(afd.getFileDescriptor());
afd.close();
mp.prepare();
mp.start();

Попробуйте сначала это в Деятельности, так как getAssets() необходимо вызывать из контекста.Этот метод позволяет обойти проблемы, которые могут возникать в пакете ресурсов, и может лучше определить, где истинный виновник.

Надеюсь, это поможет!

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