我试图使用MediaPlayer
实例分别播放多个音频文件,以响应各种传感器事件。MediaPlayer给出了不同的结果,如果它必须等待更长的时间之后.start()被调用
我发现在调用MediaPlayer.start()
之前加载要播放的片段时,音频片段将会播放正常。但是,该应用程序的性能受到重大影响。理想情况下,每个音频剪辑应该在播放最后一个音频剪辑后立即加载到MediaPlayer中,让MediaPlayer随时可以开始播放。
我期望这很简单,但现在我制作了音频改变只是不播放。 PlayAudioClip()
肯定仍在按预期方式调用,但之后出现了问题。没有错误发生,所以我不认为MediaPlayer正在改变状态,但在等待播放的时候可能会干扰它。
这里是我的代码的简化版本:
public class MainActivity extends Activity implements SensorEventListener {
private Random numGenerator;
private SensorManager manager;
private Sensor accelerometer;
private MediaPlayer mediaPlayer;
private Uri[] audioClips;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initVariables();
prepareNextAudioClip(); //load first audioClip
}
@Override
public void onSensorChanged(SensorEvent event) {
if(conditionsRight()){
playAudioClip();
}
}
}
private void playAudioClip() {
mediaPlayer.start();
prepareNextAudioClip();
}
private void prepareNextAudioClip() {
try {
mediaPlayer.reset();
Uri audioClip = audioclips[(int) Math.floor(numGenerator.nextDouble()*audioClips.length)];
mediaPlayer.setDataSource(this, audioClip);
mediaPlayer.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
//Code below here isn't very important... handling setup and teardown
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
protected void onResume() {
super.onResume();
manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_UI);
}
private void initVariables() {
audioClips = new Uri[]{
Uri.parse("android.resource://com.example.afraidofflying/" + R.raw.audio1),
Uri.parse("android.resource://com.example.afraidofflying/" + R.raw.audio2),
Uri.parse("android.resource://com.example.afraidofflying/" + R.raw.audio3)
};
numGenerator = new Random();
mediaPlayer = new MediaPlayer();
manager = (SensorManager)getSystemService(SENSOR_SERVICE);
accelerometer = manager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if(null == accelerometer) finish();
}
protected void onPause() {
super.onPause();
manager.unregisterListener(this);
}
protected void onDestroy(){
mediaPlayer.release();
mediaPlayer = null;
}
}
PS:这已经全部假设我将只使用的MediaPlayer的一个实例,但我也喜欢上输入,如果你认为使用多个MediaPlayers并委派他们每个人1个音频剪辑将是明智的。我的直觉是没有,因为我的目的,我不得不使用10-20 MediaPlayers,但它是很好的听到外界的观点。