我正在制作一款使用加速计的应用程序,当它检测到摇动动作时,它会从原始文件夹中播放声音。我的问题是,如果声音未完成并且我检测到新的摇动动作,它将再次触发声音并且前一个将被取消。我希望在播放新的声音文件之前完成之前的声音文件。我怎么能做到这一点?应该在传感器还是游戏类中完成? 这是一个吸收渣油然后启动媒体播放器的类。
public void Play(final int resid) {
Log.d(TAG, "i Play(med resid)");
if (mp != null && mp.isPlaying()) { //ta bort isplaying
Log.v(TAG, "Reset");
mp.reset();
Log.v(TAG, "Release");
mp.release();
}
if (resid == 0) {
Toast.makeText(this, "Choose an instrument", Toast.LENGTH_SHORT).show();
} else {
Log.d(TAG,"Now playing!");
mp = MediaPlayer.create(getApplicationContext(), resid);
mp.start();
int duration = mp.getDuration();
Log.v(TAG, "Length: " + duration);
}
}
这是传感器之一
public void TiltingSensor(SensorEvent event, int resid) {
Sensor mSensor = event.sensor;
if (mSensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float x_axis = event.values[0];
float y_axis = event.values[1];
if ((x_axis < 9.80 && x_axis > 0.50) && (y_axis > -9 && y_axis < 0 )){
//Log.d("Angles", Float.toString(x_axis) + " Y: " + Float.toString(y_axis));
Play(resid);
}
}
}
答案 0 :(得分:0)
是你重启玩家:
if (mp != null && mp.isPlaying()) { //ta bort isplaying
Log.v(TAG, "Reset");
mp.reset();
Log.v(TAG, "Release");
mp.release();
}
尝试将代码更改为:
if (mp != null && mp.isPlaying()) {
Log.v(TAG, "Already playing");
return;
} else if (mp != null) { // it's better to release player
Log.v(TAG, "Release");
mp.release();
}
答案 1 :(得分:0)
如果您想在第一次播放时检测到动作时第二次启动音乐,则在返回之前使用Play()中的增量引用计数,如果媒体播放器为isPlaying()返回true。 然后在oncompletionListener()中,减少引用计数并发布消息以再次调用Play()。