Search code examples
androidif-statementbuttonintmedia-player

Can't pass an int from button if / else case to media player


how are you supposed to let the mediaplayer know what it is supposed to play?

wholeTextPlayer = MediaPlayer.create(Lesson1Reading.this, engAu);

It works fine if I declare the file in the top:

MediaPlayer wholeTextPlayer;
private int engAu = R.raw.l1r_en_l10;
Button btn_default_acc_whole;

It doesn't work from within a button click if / else statement wherever I try to put it with the following combination:

MediaPlayer wholeTextPlayer;
private int engAu;
Button btn_default_acc_whole;

The button click:

final Button btn_default_acc_whole = (Button) findViewById(R.id.btn_default_acc_whole);
    btn_default_acc_whole.setOnClickListener(new View.OnClickListener() {
        public void onClick(View arg0) {
            if (wholeTextPlayer.isPlaying()) {
                wholeTextPlayer.pause();

            } else {
                wholeTextPlayer.start();
                startPlayProgressUpdater();
            }
            setEngAu(R.raw.l1r_en_l10); //this line doesn't want to fit anywhere
        }
    });

The setter:

public void setEngAu(int engAu) {
        this.engAu = engAu;
    }

Of course they are separately placed in the activity, I just copied and pasted the relevant bits from it.

Thanks guys.

Here is the whole code:

'public class Lesson1Grammar extends Activity {

private SeekBar seekBar;
MediaPlayer wholeTextPlayer;
private int engAu;
private final Handler handler = new Handler();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.lesson1grammar);
    WholeDefAccPlayer();

    final RelativeLayout playerScreen = (RelativeLayout)findViewById(R.id.playerScreen);

    final ImageButton btn_player_screen = (ImageButton) findViewById(R.id.btn_player_screen);
    btn_player_screen.setOnClickListener(new View.OnClickListener() {

        //this hides/unhides the part of the layout in which the player is
        @Override
        public void onClick(View arg0) {
            if (playerScreen.isShown()) {
                playerScreen.setVisibility(View.GONE);
            } else {
                playerScreen.setVisibility(View.VISIBLE);
            }
        }
    });


    final Button btn_default_acc_whole = (Button) findViewById(R.id.btn_default_acc_whole);
    btn_default_acc_whole.setOnClickListener(new View.OnClickListener() {



        public void onClick(View arg0) {
            if (wholeTextPlayer.isPlaying()) {
                wholeTextPlayer.pause();
            } else {
                setEngAu(R.raw.default_acc_audio);
                wholeTextPlayer.start();
                startPlayProgressUpdater();
            }
        }
    });
}

public void setEngAu(int engAu) {
    this.engAu = engAu;
}

private void WholeDefAccPlayer() {

    wholeTextPlayer = MediaPlayer.create(Lesson1Grammar.this, engAu);
    ((TextView) findViewById(R.id.getTitleOfAccent)).setText(R.string.btn_lesson1reading);

    seekBar = (SeekBar) findViewById(R.id.seekBar);
    seekBar.setMax(wholeTextPlayer.getDuration());
    seekBar.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            seekChange(v);
            return false;
        }
    });
}

public void startPlayProgressUpdater() {
    seekBar.setProgress(wholeTextPlayer.getCurrentPosition());

    if (wholeTextPlayer.isPlaying()) {
        Runnable notification = new Runnable() {
            public void run() {
                startPlayProgressUpdater();
            }
        };
        handler.postDelayed(notification, 1000);
    }
    else wholeTextPlayer.pause();
}

// This is event handler thumb moving event
private void seekChange(View v){
    if(wholeTextPlayer.isPlaying()){
        SeekBar sb = (SeekBar)v;
        wholeTextPlayer.seekTo(sb.getProgress());
    }
}

} '


Solution

  • if your plan is to make the method setEngAu() is the controller as you mentioned in the comment. then you you need to use that method like this

    public void setEngAu(int enAu)
    {
    this.EngAu = enAu;
    wholeTextPlayer.setDataSource(engAu);
    wholeTextPlayer.prepare();
    }
    

    you need to implement onPrepared listener from the media player I do not know your classes but I assume where you say something like;

    wholeTextPlayer = new MediaPlayer();
    wholeTextPlayer.setOnPreparedListener(this);
    

    here you start the player after it became prepared

     public void onPrepared(MediaPlayer player)
        {
           player.start();
        }
    

    Remember to you will need to call wholeTextPlayer.release() if you do not want the player to hold on that resource anymore( think of it as memory issues - recommended if you check the documentation)

    EDIT : I adjusted your code a little, please take a look and let me know.

    private SeekBar seekBar;
    MediaPlayer wholeTextPlayer;
    private int engAu;
     final Handler handler = new Handler();
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.lesson1grammar);
            WholeDefAccPlayer();
    
            final RelativeLayout playerScreen = (RelativeLayout) findViewById(R.id.playerScreen);
    
            final ImageButton btn_player_screen = (ImageButton) findViewById(R.id.btn_player_screen);
            btn_player_screen.setOnClickListener(new View.OnClickListener()
            {
                //this hides/unhides the part of the layout in which the player is
                @Override
                public void onClick(View arg0)
                {
                    if(playerScreen.isShown())
                    {
                        playerScreen.setVisibility(View.GONE);
                    }
                    else
                    {
                        playerScreen.setVisibility(View.VISIBLE);
                    }
                }
            });
    
    
            final Button btn_default_acc_whole = (Button) findViewById(R.id.btn_default_acc_whole);
            btn_default_acc_whole.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View arg0)
                {//problem here is
                    if(playerState == PlayerState_Playing)
                    {
                        wholeTextPlayer.pause();
                        setPlayerState(PlayerState_Paused);
                    }
                    else if(playerState == PlayerState_Paused)
                    {
                        wholeTextPlayer.start();
                        setPlayerState(PlayerState_Playing);
                    }
                    else
                    {
                        setEngAu(R.raw.default_acc_audio);
                        wholeTextPlayer.start();
                        startPlayProgressUpdater();
                        setPlayerState(PlayerState_Playing);
                    }
                }
            });
        }
    
        public void setEngAu(int engAu)
        {
            this.engAu = engAu;
            if(wholeTextPlayer !=null)
            {//just in case you call this method and player was not initialized yet
                wholeTextPlayer.release();
            }
    
            setPlayerState(PlayerState_Preparing);
            wholeTextPlayer = MediaPlayer.create(this, engAu);
        }
    
        private void WholeDefAccPlayer()
        {
            //this line probably will fail because engAu is not really initialized yet, unless you have default value for it
            wholeTextPlayer = MediaPlayer.create(this, engAu);
            ((TextView) findViewById(R.id.getTitleOfAccent)).setText(R.string.btn_lesson1reading);
    
            seekBar = (SeekBar) findViewById(R.id.seekBar);
    
            //you can not call getDuration unless the player is prepared, so this might crash you
    //        seekBar.setMax(wholeTextPlayer.getDuration());
    
            seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
            {
                @Override
                public void onProgressChanged(SeekBar seekBar, int i, boolean b)
                {
                    if(playerState != PlayerState_Preparing)
                    {//if player state is preparing it means we can not seek yet, player.start() must be called first
                        wholeTextPlayer.seekTo(i);
                    }
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar)
                {
    
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar)
                {
    
                }
            });
        }
    
        public void startPlayProgressUpdater()
        {
            if(seekBar.getMax() != wholeTextPlayer.getDuration())
            {//in case you change track later, this will check if the seek bar max value with track duration.
                // if they are not the same, then it will adjust it for you
                seekBar.setMax(wholeTextPlayer.getDuration());
            }
    
            seekBar.setProgress(wholeTextPlayer.getCurrentPosition());
    
            if(wholeTextPlayer.isPlaying())
            {
                Runnable notification = new Runnable()
                {
                    public void run()
                    {
                        startPlayProgressUpdater();
                    }
                };
                handler.postDelayed(notification, 1000);
            }
            else wholeTextPlayer.pause();
        }
    
        // This is event handler thumb moving event
        private void seekChange(View v)
        {
            if(wholeTextPlayer.isPlaying())
            {
                SeekBar sb = (SeekBar) v;
                wholeTextPlayer.seekTo(sb.getProgress());
            }
        }
    
        private final int PlayerState_Preparing = 0;
        private final int PlayerState_Playing = 1;
        private final int PlayerState_Paused = 2;
    
        private int playerState;
        private void setPlayerState(int state)
        {//this is used to track the player state, because wholeTextPlayer.isPlaying() can return false in many conditions ( too general )
            //you can check in the media player documentation to know more details about this
            playerState = state;
        }