我遇到SoundPool崩溃的问题,但没有提供崩溃的程序指示。崩溃之后,在重新加载应用程序之前它不会播放任何声音(通过后退按钮退出然后重新启动是不够的)。 LogCat给了我这些错误消息:
AudioFlinger: no more track names availlable [sic]
AudioTrack: AudioFlinger could not create track, status: -12
SoundPool: Error creating AudioTrack
然而,尽管存在这些错误,SoundPool.play()仍会返回一个正整数,该整数会针对每个新的播放请求递增,根据文档,该请求表示没有错误。其他人为此问题启动了一个问题: http://code.google.com/p/android/issues/detail?id=13453
......但是,没有回复。下面的代码是一个极简主义的活动,可以不断重现此问题。只需创建一个新的Android项目,将LinearLayout的ID设置为main_bg,将TextView的ID设置为main_tv,并将名为ding的声音文件添加到res / raw。声音文件需要足够长才能在第一个声音完成之前点击屏幕四次;我的是一个1.7秒22050赫兹的单声道MP3 @ 96kbps。短暂停顿后,第五次点击将通过LogCat生成上面的错误消息。或者,你可以点击很多次,直到声音停止播放。
我已经测试了在运行Android 1.6的T-Mobile G1上发生的错误消息,但它们不会出现在1.6仿真器,2.1仿真器或2.2仿真器上。
有没有人知道如何解决这个问题,或者SoundPool对G1的重合声音效果毫无价值?
代码:
public class SoundTestActivity extends Activity implements OnClickListener {
private SoundPool mSoundPool;
private HashMap<Integer, Integer> mSoundPoolMap;
private int index = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViewById(R.id.main_bg).setOnClickListener((OnClickListener)this);
initSounds();
mSoundPoolMap.put(index, mSoundPool.load(getApplicationContext(), R.raw.ding, 1));
}
public void initSounds() {
mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
mSoundPoolMap = new HashMap<Integer, Integer>();
}
@Override
public void onClick(View v) {
int result = mSoundPool.play(mSoundPoolMap.get(index), 0.99f, 0.99f, 1, 0, 1f);
((TextView)findViewById(R.id.main_tv)).setText(Integer.toString(result));
}
}
答案 0 :(得分:0)
只是一个猜测,但我不喜欢这个......
findViewById(R.id.main_bg).setOnClickListener((OnClickListener)this);
执行此操作时,会查找并夸大视图,允许您使用setOnClickListener()
,但不会将其分配给任何内容。我猜测它在某些时候是垃圾收集,这可能会导致你的问题。
你的描述说它是一个LinearLayout?如果是这样,试试这个......
public class SoundTestActivity extends Activity implements OnClickListener {
private SoundPool mSoundPool;
private HashMap<Integer, Integer> mSoundPoolMap;
private int index = 0;
private LinearLayout ll = null; // ADD THIS!!!
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ll = findViewById(R.id.main_bg); // ASSIGN TO ll
ll.setOnClickListener((OnClickListener)this); // SET LISTENER