您好我正在编写一个Android应用程序,它将播放我随应用程序提供的一组音频文件,以及允许用户创建和播放自己的音频。我遇到的问题是我不知道存储文件的位置。如果我将它们存储在外部(SD卡)位置,我不确定在安装我的应用程序时如何将这些文件发送到用户的外部存储。我以为我可以在资产和外部的自定义声音。
当我尝试这样做时,我得到以下错误: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);
}
有任何想法或建议吗?
谢谢! 拉达
答案 0 :(得分:1)
作为快速解决方法,您可以avoid compression将文件名更改为songid.mp3
。
该帖子的作者还建议在命令行上将-0
选项的扩展名传递给aapt
:
首先,您可以提供资产文件 上面列表中的扩展名。而 这不一定有意义, 如果你这可以是一个简单的解决方法 不想对付 命令行。另一种选择是 将特定扩展名传递给-0 标志,如-0 db,禁用 压缩资产 延期。您可以传递-0标志 多次,每次都有一次 单独扩展,如果您需要更多 比未压缩的一种类型。
如果您有冒险精神,可以尝试使用aapt
替换aapt
替换-0 mus
{{1}}替换{{1}}。
答案 1 :(得分:0)
谢谢马修!我将名称从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();
有效!谢谢!