2016-09-22 108 views
1

我正在製作使用加速度計的應用程序,當它檢測到搖動動作時,它會從原始文件夾播放聲音。我的問題是,如果聲音未完成,並且我檢測到新的搖動動作,則會再次觸發聲音,而前一個動作將被取消。我希望先前的聲音文件能夠在新的聲音文件播放之前完成。我怎樣才能做到這一點?是否應該在傳感器或遊戲班上完成? 這是需要一個渣油然後啓動媒體播放器的類。強制安卓媒體播放器在重新開始之前完成播放

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

這是你的一個球員:

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

如果你想當第二次開始音樂時,第一次播放時檢測到otion,如果媒體播放器對isPlaying()返回true,則在返回之前使用Play()中的增量引用計數。 然後在oncompletionListener()中,遞減引用計數併發布消息以再次調用Play()。