1

我将 Beep.mp3 文件添加到我的项目中并将其类型设置为 RawResource。构建后,我可以看到在 R.Raws.Beep 中生成的 id,所以我认为一切都很好。但是,当我尝试使用该资源并将声音加载到 SoundPool 实例中时,我收到一条异常消息“来自可绘制资源 ID #0x7f030000 的文件 res/raw/beep.mp3”,另外在设备日志窗口中,我可以看到 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?),但我觉得代码是正确的并且可以工作,但资源不知何故搞砸了。

4

1 回答 1

2

该异常是由于 dot42 的 APK 打包器中的问题引起的。它不应压缩某些资源(基于已压缩文件的已知扩展名)。

我们可以使用当前的 dot42 版本重现该问题。当从压缩中排除 .mp3 时,问题就解决了。我们现在将添加正确的扩展列表。此修复程序将在下一次更新中。(2013 年 8 月 27 日更新 1.0.1.74)

披露,我为 dot42 工作。

于 2013-08-04T10:22:45.413 回答