Rasmnev
Rasmnev

Reputation: 119

Android mediaPlayer only plays file once

I'm trying to create an app that play a certain audio file, that was previously recorded, when I press a button or shake my phone. Here is my code.

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

    }
}

}

My problem is that when I run it, I can only play it once. If I press the button a second time or shake it again, it does nothing. Can anyone help?

Upvotes: 2

Views: 2795

Answers (4)

Etun
Etun

Reputation: 403

Try to use:

mediaPlayer.reset()

after:

mediaPlayer.stop()

instead of release.

Upvotes: 1

palamunder
palamunder

Reputation: 2775

Long story short - you have to use:

setLooping(true)

For more information about the Media Player check the post below. Take in mind the state diagram

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

MediaPlayer State diagram

Upvotes: -2

Squonk
Squonk

Reputation: 48871

The easy fix is to simply add player.reset() in your play() method BEFORE calling player.setDataSource(...).

You can only call setDataSource(...) once without resetting the player. It is legal to call reset() in any state however (even if the player isn't yet initialized).

In other words, even if it's the first time you've called play() it is OK to use the following code in your play() method...

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

Upvotes: 6

Yakir Yehuda
Yakir Yehuda

Reputation: 720

You can only set data source once. in you code everytime the user presses the button you do this:

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

whice is wrong.

you need to setdata and prepare once and play how many times you want.

like so: put this in you onCreate:

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

in the onClick(View v), just have :

player.play();

Upvotes: -1

Related Questions