我正在使用Android媒体应用程序,因为我希望在特定时间段内同时播放声音文件。所以我创建了一个类,我在这个类中使用SoundPool
和Thread
概念来播放声音,但是当我运行我的应用程序时,它将进入ANR状态并在日志中显示警告猫
样本2130968576未准备好
任何人都可以帮我解决这个问题......
类
package com.kodspider.funk;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;
public class CustomPlayer implements Runnable{
int song_id;
long time;
int button_id;
Context ctx;
SoundPool soundpool;
public CustomPlayer(int s_id, long Time, Context ct){
song_id = load(ctx, s_id, 0);
time = Time;
ctx = ct;
}
public void run(){
long start = System.currentTimeMillis();
System.out.println("set_time:"+time+"Song_id:"+song_id+"current_time:"+start);
long end = start + time;
while (System.currentTimeMillis() < end){
//Initialization
soundpool = new SoundPool(8, AudioManager.STREAM_MUSIC, 0);
soundpool.play(song_id, 1.0f, 1.0f, 1, -1, 1.0f);
}
}
public int load (Context context, int resId, int priority){
return resId;
}
}
logcat的
07-07 10:57:51.828: I/ApplicationPackageManager(13625): cscCountry is not German : INS
07-07 10:57:57.656: I/ApplicationPackageManager(13625): cscCountry is not German : INS
07-07 10:57:59.343: W/KeyCharacterMap(13625): Can't open keycharmap file
07-07 10:57:59.343: W/KeyCharacterMap(13625): Error loading keycharmap file
07-07 10:57:59.343: W/KeyCharacterMap(13625): Using default keymap
07-07 10:58:44.820: I/ApplicationPackageManager(13625): cscCountry is not German : INS
07-07 10:58:49.718: I/System.out(13625): TAG------->60000---->2130968576
07-07 10:58:49.726: W/SoundPool(13625): sample 2130968576 not READY
答案 0 :(得分:3)
我正在使用我的应用Beat Shaker做类似的事情,我遇到了同样的问题。我使用onLoadCompleteListener解决了它:
// Sound pool new instance
SoundPool spool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);
// Sound pool on load complete listener
spool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
Log.i("OnLoadCompleteListener","Sound "+sampleId+" loaded.");
boolean loaded = true;
}
});
// Load the sample IDs
int soundId = new int[3];
soundId[0] = spool.load(this, R.raw.sound1, 1);
soundId[1] = spool.load(this, R.raw.sound2, 1);
soundId[2] = spool.load(this, R.raw.sound3, 1);
在播放声音之前,你可以使用布尔“加载”来检查它是否正确加载。
答案 1 :(得分:1)
你需要先load()
你的声音。这会将它们加载到准备好play()
的内存中。这将返回您需要存储并传递给play()
来自SoundPool文档:
让我们来看一个典型的用例:游戏由几个级别的游戏组成。对于每个级别,都有一组仅由该级别使用的独特声音。在这种情况下,游戏逻辑应该在加载第一级时创建一个新的SoundPool对象。级别数据本身可能包含此级别要使用的声音列表。加载逻辑迭代调用适当的SoundPool.load()函数的声音列表。这通常应该在过程的早期完成,以便有时间将音频解压缩为原始PCM格式,然后才能播放。
请查看此示例中的SoundPool部分:http://www.vogella.com/articles/AndroidMedia/
答案 2 :(得分:0)
你可以看到代码
public class SoundManager {
public static int SOUNDPOOLSND_MENU_BTN = 0;
public static int SOUNDPOOLSND_WIN = 1;
public static int SOUNDPOOLSND_LOOSE = 2;
public static int SOUNDPOOLSND_DRAW = 3;
public static int SOUNDPOOLSND_TICK1 = 4;
public static int SOUNDPOOLSND_TICK2 = 5;
public static int SOUNDPOOLSND_OUT_OF_TIME = 6;
public static int SOUNDPOOLSND_HISCORE = 7;
public static int SOUNDPOOLSND_CORRECT_LETTER = 8;
public static boolean isSoundTurnedOff;
private static SoundManager mSoundManager;
private SoundPool mSoundPool;
private SparseArray<Integer> mSoundPoolMap;
private AudioManager mAudioManager;
public static final int maxSounds = 4;
public static SoundManager getInstance(Context context) {
if (mSoundManager == null) {
mSoundManager = new SoundManager(context);
}
return mSoundManager;
}
public SoundManager(Context mContext) {
mAudioManager = (AudioManager) mContext
.getSystemService(Context.AUDIO_SERVICE);
mSoundPool = new SoundPool(maxSounds, AudioManager.STREAM_MUSIC, 0);
mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
boolean loaded = true;
}
});
mSoundPoolMap = new SparseArray<Integer>();
mSoundPoolMap.put(SOUNDPOOLSND_MENU_BTN,
mSoundPool.load(mContext, R.raw.rain, 0));
mSoundPoolMap.put(SOUNDPOOLSND_WIN,
mSoundPool.load(mContext, R.raw.nature, 1));
mSoundPoolMap.put(SOUNDPOOLSND_LOOSE,
mSoundPool.load(mContext, R.raw.piano, 2));
mSoundPoolMap.put(SOUNDPOOLSND_TICK1,
mSoundPool.load(mContext, R.raw.relax, 3));
mSoundPoolMap.put(SOUNDPOOLSND_TICK2,
mSoundPool.load(mContext, R.raw.storm, 4));
// testing simultaneous playing
int streamVolume = mAudioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(0), streamVolume, streamVolume, 1,
0, 1f);
mSoundPool.play(mSoundPoolMap.get(1), streamVolume, streamVolume, 1, 0,
1f);
mSoundPool.play(mSoundPoolMap.get(2), streamVolume, streamVolume, 1, 0,
1f);
}
public void playSound(int index) {
if (isSoundTurnedOff)
return;
int streamVolume = mAudioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index), streamVolume, streamVolume,
1, 0, 1f);
}
public static void clear() {
if (mSoundManager != null) {
mSoundManager.mSoundPool = null;
mSoundManager.mAudioManager = null;
mSoundManager.mSoundPoolMap = null;
}
mSoundManager = null;
}
}