我試圖使用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,但它是很好的聽到外界的觀點。