主要编辑:找到解决问题的方法!!向下滚动!!
我和你在同一条船上。在阅读之前,我必须让您知道我未能提供可以解决此问题的答案。
我已经看到了很多关于 SoundPool 的 Stack Overflow 主题,但我还没有从 Android 书籍中看到很多关于 Java 代码的 SoundPool 问题:
AudioTrack:AudioFlinger 无法创建轨道,状态 -12。
SoundPool:创建 AudioTrack 时出错。
这里是从这里提供的Beginning Android 4 Game Development 源代码中截取的代码(见下文)。你会得到explosion.ogg 文件(在trunk 中,找到Chapter 4 - Android Basics 的/asset 文件夹)。您必须点击右侧的“查看原始文件”才能获取文件。
我所做的只是将源代码直接复制到 Eclipse 中,并将主干提供的explosion.ogg 文件添加到我的项目中。我执行了 Android 模拟器,尝试播放该文件,但我可以告诉你,我仍然得到上面引用的相同 Logcat 错误。
有人在 Youtube 上提供了一段视频,说明 SoundPool 工作正常。视频链接如下。我按照视频的指示进行了编码,我从上面提供的第二个链接中获取了相同的爆炸.ogg 文件。我仍然收到这些错误:
03-13 05:17:10.143:E/AudioTrack(3370):AudioFlinger 无法创建轨道,状态:-12
03-13 05:17:10.143: E/SoundPool(3370): 创建 AudioTrack 时出错
我确实知道 SoundPool 从 Android 1.0 开始就存在,处于 API 级别 1。SoundPool 没有任何原因无法工作,即使我有证据证明 SoundPool 工作(视频链接,第二个)。
这些是我的发现,可能会或可能不会以好的方式帮助他人。简而言之,你并不孤单。
来源:
- http://code.google.com/p/beginning-android-games/source/browse/trunk/ch04-android-basics/src/com/badlogic/androidgames/SoundPoolTest.java
- http://www.youtube.com/watch?v=ioGWpu8Ud7A
编辑:我可以从 SoundPool 播放声音。
这是我的代码:
package nttu.edu.test;
import nttu.edu.R;
import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class SoundPoolTest extends Activity implements OnClickListener {
SoundPool soundPool = null;
int explosionId = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView v = new TextView(this);
v.setOnClickListener(this);
setContentView(v);
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
v.setText("Click anywhere to play the sound.");
}
protected void onResume() {
super.onResume();
if (soundPool == null) {
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
explosionId = soundPool.load(this, R.raw.explosion, 1);
}
}
protected void onPause() {
super.onPause();
if (soundPool != null) {
soundPool.release();
soundPool = null;
}
}
public void onClick(View v) {
if (explosionId != 0)
soundPool.play(explosionId, 1, 1, 0, 0, 1);
}
}
我所做的是重构我的代码。我从 Youtube 视频链接中的一个 cmets 中学到了这个技巧,其中评论的作者名为“ErichLancaster”。所有学分都归他所有。我希望这对您有所帮助。
我还将 Android 模拟器的分辨率大小设置为 QVGA,不管它是否真的重要。