我正在开发一个使用加速度计的应用程序,当它检测到抖动时,它会播放raw文件夹中的声音。我的问题是,如果声音没有结束,我检测到一个新的摇动动作,它会再次触发声音,前一个将被取消。我希望在播放新的声音文件之前完成上一个声音文件。我怎样才能做到这一点呢?应该在传感器类还是在play类中完成?这是一个获取resid然后启动媒体播放器的类。
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);
}
}
}
发布于 2016-09-23 07:37:43
是你在重启player:
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();
}
发布于 2016-09-23 11:28:43
如果您希望在第一次播放时检测到运动时再次启动音乐,则如果media player对isPlaying()返回true,则在返回之前在Play()中使用递增的引用计数。然后在oncompletionListener()中,递减引用计数并发送一条消息以再次调用Play()。
https://stackoverflow.com/questions/39647962
复制相似问题