强制Android媒体播放器在重新开始之前完成播放

时间:2016-09-22 20:03:36

标签: java android android-mediaplayer android-sensors

我正在制作一款使用加速计的应用程序,当它检测到摇动动作时,它会从原始文件夹中播放声音。我的问题是,如果声音未完成并且我检测到新的摇动动作,它将再次触发声音并且前一个将被取消。我希望在播放新的声音文件之前完成之前的声音文件。我怎么能做到这一点?应该在传感器还是游戏类中完成? 这是一个吸收渣油然后启动媒体播放器的类。

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);
        }
    }
}

2 个答案:

答案 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()。

相关问题