Android mediaPlayer只播放一次文件

时间:2015-02-15 10:52:57

标签: android android-mediaplayer

当我按下按钮或摇动手机时,我正在尝试创建播放某个音频文件的应用程序,该应用程序之前已录制过。这是我的代码。

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

    }
}

}

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

4 个答案:

答案 0 :(得分:6)

简单的解决方法是在player.reset()方法之前调用play()简单地添加player.setDataSource(...)

您只能在不重置播放器的情况下拨打setDataSource(...)一次。在任何州调用reset()是合法的(即使播放器尚未初始化)。

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

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

答案 1 :(得分:1)

尝试使用:

mediaPlayer.reset()

后:

mediaPlayer.stop()

而不是释放。

答案 2 :(得分:0)

您只能设置一次数据源。 每当用户按下按钮时,在你的代码中执行此操作:

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

答案 3 :(得分:-1)

长话短说 - 你必须使用:

setLooping(true)

有关媒体播放器的更多信息,请查看以下帖子。请记住状态图

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

MediaPlayer State diagram