Android mediaPlayer 只播放文件一次

Android mediaPlayer only plays file once

我正在尝试创建一个应用程序,当我按下按钮或摇动 phone 时,它会播放之前录制的特定音频文件。这是我的代码。

public class Reproduzir extends Activity implements SensorEventListener{
MediaPlayer player = new MediaPlayer();
SensorManager sensor;

@Override
protected void onCreate(Bundle savedInstanceState ){
    super.onCreate(savedInstanceState);

    sensor= (SensorManager) getSystemService(SENSOR_SERVICE);
    setContentView(R.layout.reproduzir);
    Button reproduzir = (Button) findViewById(R.id.reproduzir);
    reproduzir.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            play();

        }
    });
    Button fechar= (Button) findViewById(R.id.fechar);
    fechar.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (player.isPlaying()) {
                player.stop();
                player.release();
            }
            finish();


        }
    });

}
public void play(){
    try {
        player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
        player.prepare();
        player.start();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}
public void onStart(){
    super.onStart();
    sensor.registerListener(this,sensor.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_FASTEST);
}


@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // TODO Auto-generated method stub

}

@Override
public void onSensorChanged(SensorEvent event) {
    // TODO Auto-generated method stub
    if(event.values[0]>10.2
            ||event.values[1]>10.2
            ||event.values[2]>10.2){
        play();

    }
}

}

我的问题是,当我 运行 它时,我只能播放一次。如果我再次按下按钮或再次摇动它,它什么也不做。有人可以帮忙吗?

您只能设置一次数据源。 在你的代码中,每次用户按下你这样做的按钮时:

 player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");

哪里错了。

你只需要设置数据和准备一次,玩多少次就玩多少次。

像这样: 把这个放在你的 onCreate:

try {
    player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
    player.prepare();
    player.start();

在 onClick(View v) 中,只需:

player.play();

尝试使用:

mediaPlayer.reset()

之后:

mediaPlayer.stop()

而不是释放。

长话短说 - 您必须使用:

setLooping(true)

有关媒体播放器的更多信息,请查看下面的 post。牢记状态图

http://developer.android.com/reference/android/media/MediaPlayer.html

MediaPlayer State diagram

简单的解决方法是在 play() 方法 中添加 player.reset(),然后 调用 player.setDataSource(...).

您只能调用 setDataSource(...) 一次而不重置播放器。然而,在任何状态下调用 reset() 都是合法的(即使播放器尚未初始化)。

换句话说,即使这是您第一次调用 play(),也可以在 play() 方法中使用以下代码...

try {
    player.reset();
    player.setDataSource(Environment.getExternalStorageDirectory().getPath()+"/2cp.3gp");
    player.prepare();
    player.start();
}
// Your catch blocks here