我将Beep.mp3文件添加到我的项目中,并将其类型设置为RawResource。构建之后,我可以看到R.Raws.Beep中生成的id,所以我认为一切都很好。但是当我尝试使用该资源并将声音加载到SoundPool实例中时,我收到一条消息“文件res / raw / beep.mp3来自可绘制资源ID#0x7f030000”,另外在设备日志窗口中我可以看到SoundPool日志“示例0没有成立“(真的,这就是它说的,”成立“)。我甚至检查了我的应用程序的apk文件的内容,我可以看到res / raw / beep.mp3真的存在,所以似乎嵌入资源在包中工作,错误的原因是在我的代码或我没有做某事否则它需要工作。
当用户在我的应用程序中执行操作时,此文件的原因是发出哔声,因此它不像我自己的winamp克隆或类似的那样。
好的,这是我执行的代码,我得到了一个例外:
public static class SoundMaster
{
public static int BeepSoundId = 1;
private static readonly SoundPool SPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
private static readonly HashMap<int, int> SoundPoolMap = new HashMap<int, int>();
private static Context _context;
public static void InitSounds(Context context)
{
try
{
_context = context;
var loaded = SPool.Load(_context, R.Raws.Beep, 1);
SoundPoolMap.Put(BeepSoundId, loaded);
}
catch (Exception ex)
{
Log.E("InitSounds exception", ex.Message);
}
}
}
我从我的活动OnCreate方法调用SoundMaster.InitSounds()方法将其作为参数传递,所以我相信它是完全正确的Context实例。
有一件事是嵌入在apk中的文件名为beep.mp3,项目中包含的实际文件是Beep.mp3,但我尝试了多次使用不同的文件和资源ID名称,并且总是得到相同的异常。
所有人都可以分享一些关于这个代码可能导致我麻烦的原因的想法吗?或者我应该使用不同的方式播放我的哔声(例如MediaPlayer?)但是我感觉代码是正确的并且工作但资源却以某种方式搞砸了。
答案 0 :(得分:2)
由于dot42的APK包装程序中存在问题而导致异常。 它不应压缩某些资源(基于已压缩文件的已知扩展)。
我们可以用当前的dot42版本重现这个问题。当从压缩中排除.mp3时,问题就解决了。我们现在将添加正确的扩展列表。 此修复程序将在下一次更新中。 (2013年8月27日更新1.0.1.74)
披露,我为dot42工作。