我正在开发一个应用程序,其中当启动新活动时,它应该开始播放声音。所以我用 mediaplayer 在 oncreate 中播放声音,效果很好。但是当我尝试使用 soundpool 时,通过在活动的 oncreate 中加载和播放它。它没有播放。我选择 soundpool,因为它比媒体播放器好。
可能是什么问题?Soundpool 在 oncreate 中不起作用吗?
我正在开发一个应用程序,其中当启动新活动时,它应该开始播放声音。所以我用 mediaplayer 在 oncreate 中播放声音,效果很好。但是当我尝试使用 soundpool 时,通过在活动的 oncreate 中加载和播放它。它没有播放。我选择 soundpool,因为它比媒体播放器好。
可能是什么问题?Soundpool 在 oncreate 中不起作用吗?
或者,您可以覆盖 OnWindowFocusChanged 以在 Activity 启动时播放文件...
像这样的东西...
public class YourActivity extends Activity {
.
.
.
private Handler mHandler;
public void onCreate(Bundle savedInstanceState) {
.
.
.
this.mHandler = new Handler();
.
.
.
}
public void onWindowFocusChanged(boolean paramBoolean)
{
if (paramBoolean)
{
this.mHandler.postDelayed(new Runnable()
{
public void run()
{
// Refer to the answer above to create the play function for your soundfile ...
YourActivity.this.play("The sound from the sound pool");
}
}
, 1000L);
}
}
也许您只需要在 onCreate 方法中设置一个睡眠。
我在尝试编写一个有时需要在醒来后立即播放声音的应用程序时遇到了几乎相同的问题。最终,经过多次试验和错误,我发现它在日志输出中输入了错误“sample NOT READY”。问题是加载声音文件是异步发生的,如果您在加载之前尝试播放声音,它会失败。
据说您可以使用一种称为 setOnLoadCompleteListener 的机制,但我还没有看到一个实际有用的示例。在上面显示的来自 mirroredAbstraction 的示例中(假设它按广告宣传的那样工作),如果声音尚未加载,那么它不会播放声音,这与您现在所拥有的几乎相同。
如果该示例以某种方式神奇地“修复”了您的问题,那么我建议这只是因为这两个方法调用中的所有额外开销基本上让您的声音在播放之前有时间加载。您可能已经在加载播放之间的 onCreate 中使用简单的 SystemClock.sleep(100) 实现了相同的结果。
根据您声音的大小,您可能需要延长延迟,但是对不同延迟进行一些实验应该会告诉您需要多少。
你可以在任何地方玩它,
用一个简单的例子来演示
创建一个方法initializeSoundPool
private void initializeSoundPool(){
mSoundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
loaded = true;
}
});
soundID = mSoundPool.load(this, R.raw.glassbreak, 1);
}
然后创建一个方法playFile
private void playFile(){
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
float actualVolume = (float) audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = (float) audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = actualVolume / maxVolume;
if (loaded) {
mSoundPool.play(soundID, volume, volume, 1, 0, 1f);
Log.e("Test", "Played sound");
}
}
然后onCreate
像这样称呼他们
private SoundPool mSoundPool;
private int soundID;
boolean loaded = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.spxml);
initializeSoundPool();
playFile();
}
或者甚至更好地调用initializeSoundPool
,onCreate
然后调用 playFile in onResume
。