Воспроизведение панели поиска проигрывателя Android Media из остановленного положения

Я пытаюсь воспроизвести песню, используя прослушиватель панели поиска. Но когда я пытаюсь перетащить индикатор выполнения, он воспроизводится с начала песни. Это нужно играть с этой перетаскиваемой позиции.

Вот мой код:

public class MainActivity extends Activity {

    private TextView prairText;
    private AssetFileDescriptor descriptor;
    private SeekBar seekBar;
    private MediaPlayer mp = new MediaPlayer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Keep screen active
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        findViewById(R.id.play_button).setVisibility(View.INVISIBLE);
        findViewById(R.id.pauseButton).setVisibility(View.VISIBLE);

        init();

        // Play prayer
        /*if (mp != null) {
            mp.start();
        }*/

        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (mp != null && fromUser) {
                    mp.seekTo(progress * 1000);
                }

            }
        });
        findViewById(R.id.play_button).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mp != null) {
                    mp.start();
                    final Handler mHandler = new Handler();
                    //Make sure you update Seekbar on UI thread
                    MainActivity.this.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            if(mp != null){
                                int mCurrentPosition = mp.getCurrentPosition() / 1000;
                                seekBar.setProgress(mCurrentPosition);
                            }
                            mHandler.postDelayed(this, 1000);
                        }
                    });
                    findViewById(R.id.play_button).setVisibility(View.INVISIBLE);
                    findViewById(R.id.pauseButton).setVisibility(View.VISIBLE);
                }
            }
        });

        findViewById(R.id.pauseButton).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp != null) {
                    mp.pause();
                    findViewById(R.id.pauseButton).setVisibility(View.INVISIBLE);
                    findViewById(R.id.play_button).setVisibility(View.VISIBLE);
                }
                mp.pause();
            }
        });
        findViewById(R.id.restart_button).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp != null) {
                    mp.seekTo(0);
                    mp.start();
                    findViewById(R.id.play_button).setVisibility(View.INVISIBLE);
                    findViewById(R.id.pauseButton).setVisibility(View.VISIBLE);
                }
            }
        });

private void init() {
        prairText = (TextView) findViewById(R.id.prairText);
        seekBar = (SeekBar) findViewById(R.id.seekBar1);
        try {
            descriptor = getAssets().openFd("mysong.mp3");
            mp.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
            descriptor.close();
            mp.prepare();
        } catch (Exception e) {
            e.printStackTrace();
        }
        seekBar.setMax(mp.getDuration());
    }

Как решить эту проблему. Заранее спасибо..


person Shailendra Madda    schedule 13.08.2015    source источник
comment
Можете ли вы проверить, каково значение длительности MediaPlayer перед этой строкой seekBar.setMax(mp.getDuration());?   -  person hardartcore    schedule 13.08.2015


Ответы (1)


Здесь я делал трюки:

  • Экземпляр MediaPlayer перемещен в метод init().

  • Изменил эту строку

int mCurrentPosition = mMediaPlayer.getCurrentPosition() / 1000;

to:

int mCurrentPosition = mp.getCurrentPosition();

  • Изменил эту строку

mp.seekTo (прогресс * 1000);

to:

mp.seekTo (прогресс);

Наконец, рабочий код будет:

public class MainActivity extends Activity {

    private TextView prairText;
    private AssetFileDescriptor descriptor;
    private SeekBar seekBar;
    private MediaPlayer mp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Keep screen active
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        findViewById(R.id.play_button).setVisibility(View.INVISIBLE);
        findViewById(R.id.pauseButton).setVisibility(View.VISIBLE);

        init();

        // Play song
        if (mp != null) {
            mp.start();
        }

        final Handler mHandler = new Handler();
        //Make sure you update Seek bar on UI thread
        MainActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                if(mp != null){
                    int mCurrentPosition = mp.getCurrentPosition();
                    seekBar.setProgress(mCurrentPosition);
                }
                mHandler.postDelayed(this, 1000);
            }
        });

        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                if (mp != null && fromUser) {
                    mp.seekTo(progress);
                    mp.start();
                    findViewById(R.id.play_button).setVisibility(View.INVISIBLE);
                    findViewById(R.id.pauseButton).setVisibility(View.VISIBLE);
                }

            }
        });
        findViewById(R.id.play_button).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mp != null) {
                    mp.start();
                    findViewById(R.id.play_button).setVisibility(View.INVISIBLE);
                    findViewById(R.id.pauseButton).setVisibility(View.VISIBLE);
                }
            }
        });

        findViewById(R.id.pauseButton).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp != null) {
                    mp.pause();
                    findViewById(R.id.pauseButton).setVisibility(View.INVISIBLE);
                    findViewById(R.id.play_button).setVisibility(View.VISIBLE);
                }
                mp.pause();
            }
        });
        findViewById(R.id.restart_button).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp != null) {
                    mp.seekTo(0);
                    mp.start();
                    findViewById(R.id.play_button).setVisibility(View.INVISIBLE);
                    findViewById(R.id.pauseButton).setVisibility(View.VISIBLE);
                }
            }
        });

private void init() {
        mp = new MediaPlayer();
        mp.reset();
        prairText = (TextView) findViewById(R.id.prairText);
        seekBar = (SeekBar) findViewById(R.id.seekBar1);
        try {
            descriptor = getAssets().openFd("mysong.mp3");
            mp.setDataSource(descriptor.getFileDescriptor(), descriptor.getStartOffset(), descriptor.getLength());
            descriptor.close();
            mp.prepare();
        } catch (Exception e) {
            e.printStackTrace();
        }
        int duration = mp.getDuration();
        seekBar.setMax(duration);
    }
}

Примечание. Не забудьте поместить mysong.mp3 в папку assets

person Shailendra Madda    schedule 13.08.2015