0
votes

I am trying to Pause and Resume a mp3 playback using a MediaPlayer playing in the background using AsyncTask.

Here is the Activity code:

public class MainActivity extends Activity implements SensorEventListener
{
    private MyGLSurfaceView mGLSurfaceView2;
    private SensorManager mSensorManager;
    private Sensor mAccelerometer;
    private Sensor mGyro;

    BackgroundSound mBackgroundSound = new BackgroundSound();

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
        this.mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        this.mGyro = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
        mGLSurfaceView2 = new MyGLSurfaceView(this);

        setContentView(mGLSurfaceView2);
        mBackgroundSound.execute();
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
        mSensorManager.registerListener(this, mGyro, SensorManager.SENSOR_DELAY_NORMAL);
        if(mBackgroundSound.player != null)
            if(mBackgroundSound.player.isPlaying()==false)
                mBackgroundSound.player.start();
        mGLSurfaceView2.onResume();
    }

    @Override
    protected void onPause()
    {
        super.onPause();
        mSensorManager.unregisterListener(this);
        if(mBackgroundSound.player.isPlaying())
        {
            mBackgroundSound.player.pause();
        }
        mBackgroundSound.player.release();
        //    mBackgroundSound.cancel(true);
        mGLSurfaceView2.onPause();
    }

    public class BackgroundSound extends AsyncTask<Void, Void, Void> {

        MediaPlayer player;

        @Override
        protected Void doInBackground(Void... params) {

            AssetFileDescriptor afd;
            player = new MediaPlayer();

            try {
                afd = getAssets().openFd("2/sound.mp3");

                if (afd != null) {
                    player.setDataSource(afd.getFileDescriptor());
                    player.prepare();
                    player.setLooping(true);
                    player.setVolume(1.0f, 1.0f);
                    //player.start();
                } else {
                    Log.i("Error", "afd is null.");
                }

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }
    }
}

logcat Error:

E/MediaPlayer: start called in state 1
E/MediaPlayer: error (-38, 0)
E/MediaPlayer: Error (-38,0)

If I move the mBackgroundSound.execute(); to onResume() the mp3 starts playing but the onResume() obviously fails the second time it is executed (when resuming the app).

I need help putting the following commands in the correct method for it to work properly (MP3 pauses when APP is minimized and resumes or restarts when APP resumes again):

mBackgroundSound.execute();
mBackgroundSound.cancel(true);
mBackgroundSound.player.start();
mBackgroundSound.player.pause();
mBackgroundSound.player.release();

Thanks!

1

1 Answers

0
votes

I figured it out right after asking. I guess I must recreate the AsyncTask everytime resuming. Working code (MP3 restart from beginning when resuming App):

public class MainActivity extends Activity implements SensorEventListener
{
    private MediaPlayer player;
    private volatile boolean mMediaPlayerStopped;

    BackgroundSound mBackgroundSound;

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

    @Override
    protected void onResume()
    {
        super.onResume();
        startMediaPlayer();
    }

    @Override
    protected void onPause()
    {
        super.onPause();
        stopMediaPlayer();
    }

    private void stopMediaPlayer() {
        Log.v("Music", "Stop MediaPlayer") ;
        mMediaPlayerStopped = true ;
        if (player != null) {
            player.stop() ;
            player.reset() ;
            player.release() ;
            player = null ;
            mBackgroundSound.cancel(true);
        }
    }

    private void startMediaPlayer() {
        Log.v("Music", "Start MediaPlayer") ;
        mMediaPlayerStopped = false;
        mBackgroundSound= new BackgroundSound();
        mBackgroundSound.execute();
    }

    public class BackgroundSound extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {

            AssetFileDescriptor afd;
            MediaPlayer mediaPlayer = new MediaPlayer();

            try {
                afd = getAssets().openFd("2/music.mp3");

                if (afd != null) {
                    mediaPlayer.setDataSource(afd.getFileDescriptor());
                    mediaPlayer.prepare();
                    mediaPlayer.setLooping(true); // Set looping
                    mediaPlayer.setVolume(1.0f, 1.0f);
                    mediaPlayer.start();

                    player = mediaPlayer ;

                    if (mMediaPlayerStopped) {
                        Log.v("Music", "MediaPlayer was stopped while preparing") ;
                        stopMediaPlayer();
                    }

                } else {
                    Log.i("Error", "afd is null.");
                }

            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalStateException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }
    }
}