Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I have changed the program in this way, solution below.</p> <pre><code>package org.example.java; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.SeekBar; public class Player extends Activity implements OnClickListener, OnTouchListener, OnCompletionListener, Runnable { private Button buttonPlayStop; private MediaPlayer mediaPlayer; private SeekBar seekBar; private final Handler handler = new Handler(); @Override public void onCreate(Bundle savedInstanceState) { Log.d("Player", "got to onCreate()"); super.onCreate(savedInstanceState); setContentView(R.layout.main); initViews(); if (savedInstanceState != null) { Log.d("Player", "got to savedInstanceState id not null"); mediaPlayer.seekTo(savedInstanceState.getInt("current_position")); seekBar.setProgress(savedInstanceState.getInt("current_position")); handler.post(this); } } @Override public void onSaveInstanceState(Bundle outState) { Log.d("Player", "got to onSaveInstanceState()"); super.onSaveInstanceState(outState); outState.putInt("current_position", mediaPlayer.getCurrentPosition()); handler.removeCallbacks(this); Log.d("Player", "got to End of onSaveInstanceState"); } private void initViews() { Log.d("Player", "got to initViews()"); buttonPlayStop = (Button) findViewById(R.id.ButtonPlayStop); buttonPlayStop.setOnClickListener(this); mediaPlayer = MediaPlayer.create(this, R.raw.testsong_20_sec); mediaPlayer.setOnCompletionListener(this); seekBar = (SeekBar) findViewById(R.id.SeekBar01); seekBar.setMax(mediaPlayer.getDuration()); seekBar.setOnTouchListener(this); Log.d("player", "got to End of initViews()"); } @Override public void onClick(View v) { Log.d("Player", "got to onClick"); switch (v.getId()) { case R.id.ButtonPlayStop: buttonClick(); break; default: break; } Log.d("Player", "got to End of onClick"); } private void buttonClick() { Log.d("Player", "got to buttonClick"); if (buttonPlayStop.getText() == getString(R.string.play_str)) { buttonPlayStop.setText(R.string.pause_str); try { mediaPlayer.start(); Log.d("Player", "got to before startPlayProgressUpdater in buttonClick"); startPlayProgressUpdater(); } catch (IllegalStateException e) { mediaPlayer.pause(); } } else { buttonPlayStop.setText(getString(R.string.play_str)); mediaPlayer.pause(); seekBar.setProgress(mediaPlayer.getCurrentPosition()); } Log.d("Player", "got to End of buttonClick"); } public void startPlayProgressUpdater() { Log.d("Player", "got to startPlayProgressUpdater()"); seekBar.setProgress(mediaPlayer.getCurrentPosition()); int pos = mediaPlayer.getCurrentPosition(); Log.d("Player", "Current position is " + Integer.toString(pos)); Log.d("Player", "got to After seekBar.setProgress"); if (mediaPlayer.isPlaying()) { Log.d("Player", "got to before handler.postDelayed"); handler.postDelayed(this, 1000); Log.d("Player", "got to after handler.postDelayed"); } else if (mediaPlayer.getCurrentPosition() &lt; mediaPlayer.getDuration()) { mediaPlayer.pause(); buttonPlayStop.setText(R.string.play_str); } Log.d("Player", "got to End of startPlayProgressUpdater()"); } @Override public boolean onTouch(View v, MotionEvent event) { Log.d("Player", "got to onTouch"); seekChange(v); return false; } private void seekChange(View v) { Log.d("Player", "got to seekChange"); if (mediaPlayer.isPlaying()) { SeekBar sb = (SeekBar) v; mediaPlayer.seekTo(sb.getProgress()); } } @Override public void run() { Log.d("Player", "got to run()"); startPlayProgressUpdater(); Log.d("Player", "got to after startPlayProgressUpdater in run()"); } @Override public void onCompletion(MediaPlayer mp) { mp.seekTo(0); } } </code></pre> <h1>Update</h1> <p>After all I find the solution, but it is very dirty :D</p> <pre><code>package org.example.java; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.SeekBar; public class Player extends Activity implements OnClickListener, OnTouchListener, OnCompletionListener, Runnable { private Button buttonPlayStop; private MediaPlayer mediaPlayer; private SeekBar seekBar; private final Handler handler = new Handler(); @Override public void onCreate(Bundle savedInstanceState) { Log.d("Player", "got to onCreate()"); super.onCreate(savedInstanceState); setContentView(R.layout.main); initViews(); if (savedInstanceState != null) { Log.d("Player", "got to savedInstanceState id not null"); mediaPlayer.seekTo(savedInstanceState.getInt("current_position")); seekBar.setProgress(savedInstanceState.getInt("current_position")); mediaPlayer.start(); handler.post(this); } } @Override public void onSaveInstanceState(Bundle outState) { Log.d("Player", "got to onSaveInstanceState()"); super.onSaveInstanceState(outState); outState.putInt("current_position", mediaPlayer.getCurrentPosition()); handler.removeCallbacks(this); Log.d("Player", "got to End of onSaveInstanceState"); pauseMedia(); } private void initViews() { Log.d("Player", "got to initViews()"); buttonPlayStop = (Button) findViewById(R.id.ButtonPlayStop); buttonPlayStop.setOnClickListener(this); mediaPlayer = MediaPlayer.create(this, R.raw.testsong_20_sec); mediaPlayer.setOnCompletionListener(this); seekBar = (SeekBar) findViewById(R.id.SeekBar01); seekBar.setMax(mediaPlayer.getDuration()); seekBar.setOnTouchListener(this); Log.d("player", "got to End of initViews()"); } @Override public void onClick(View v) { Log.d("Player", "got to onClick"); switch (v.getId()) { case R.id.ButtonPlayStop: buttonClick(); break; default: break; } Log.d("Player", "got to End of onClick"); } private void buttonClick() { Log.d("Player", "got to buttonClick"); if (buttonPlayStop.getText() == getString(R.string.play_str)) { buttonPlayStop.setText(R.string.pause_str); try { mediaPlayer.start(); Log.d("Player", "got to before startPlayProgressUpdater in buttonClick"); startPlayProgressUpdater(); } catch (IllegalStateException e) { mediaPlayer.pause(); } } else { buttonPlayStop.setText(getString(R.string.play_str)); mediaPlayer.pause(); seekBar.setProgress(mediaPlayer.getCurrentPosition()); } Log.d("Player", "got to End of buttonClick"); } public void startPlayProgressUpdater() { Log.d("Player", "got to startPlayProgressUpdater()"); seekBar.setProgress(mediaPlayer.getCurrentPosition()); int pos = mediaPlayer.getCurrentPosition(); Log.d("Player", "Current position is " + Integer.toString(pos)); Log.d("Player", "got to After seekBar.setProgress"); if (mediaPlayer.isPlaying()) { Log.d("Player", "got to before handler.postDelayed"); handler.postDelayed(this, 1000); Log.d("Player", "got to after handler.postDelayed"); } else if (mediaPlayer.getCurrentPosition() &lt; mediaPlayer.getDuration()) { mediaPlayer.pause(); buttonPlayStop.setText(R.string.play_str); } Log.d("Player", "got to End of startPlayProgressUpdater()"); } @Override public boolean onTouch(View v, MotionEvent event) { Log.d("Player", "got to onTouch"); seekChange(v); return false; } private void seekChange(View v) { Log.d("Player", "got to seekChange"); if (mediaPlayer.isPlaying()) { SeekBar sb = (SeekBar) v; mediaPlayer.seekTo(sb.getProgress()); } } @Override public void run() { Log.d("Player", "got to run()"); startPlayProgressUpdater(); Log.d("Player", "got to after startPlayProgressUpdater in run()"); } @Override public void onCompletion(MediaPlayer mp) { mp.seekTo(0); } public void pauseMedia() { mediaPlayer.pause(); } </code></pre> <p>}</p> <h1>Update 2:</h1> <p>I have find another way: <a href="http://www.androidguys.com/2008/11/07/rotational-forces-part-two/" rel="nofollow">using getLastNonConfigurationInstance()</a> method.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload