0

私のアプリケーションでは、SeekBar を実装しようとしています。SeekBar は、最初にサウンドを再生するときに正常に動作しています。しかし、ボタンをクリックしてサウンドをもう一度再生すると、MediaPlayerに関するエラーの無限ループになります。私が欲しいのは、サウンドの再生中に再生ボタンをクリックすると、サウンドが最初から再生され、SeekBar も最初から開始されることです。SeekBar を削除すると、すべて正常に動作します..しかし、SeekBar は私のアプリケーションで必要です..これらすべてを BaseAdapter に実装しました..すべてを BaseAdapter で実行する必要がありますBaseAdapterで動作するコードを教えてください..

これは私のコードです...見てください...

mediaPlayer.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(activity, "Loading Message", Toast.LENGTH_LONG).show();

                mp.reset();
                try {
                    mp.setDataSource("url for any mp3 audio file");
                } catch (IllegalArgumentException 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();
                }
                mp.prepareAsync();
                mp.setOnPreparedListener(new OnPreparedListener() {

                    public void onPrepared(final MediaPlayer mp) {
                        // TODO Auto-generated method stub
                        mp.start();
                        mediaPlayer.setBackgroundResource(R.drawable.m_pause);
                        seekBar.setProgress(0);
                        seekBar.setMax(100);
                        mUpdateTimeTask = new Thread(new Runnable() {

                            public void run() {
                                // TODO Auto-generated method stub
                                try {
                                    Thread.sleep(100);
                                } catch (InterruptedException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                                long totalDuration = mp.getDuration();
                                   long currentDuration = mp.getCurrentPosition();
                                   int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration));
                                   seekBar.setProgress(progress);
                                   mHandler.post(this);
                            }
                        });
                        mUpdateTimeTask.start();
                    }
                });
            }
        });
        mp.setOnCompletionListener(new OnCompletionListener() {

            public void onCompletion(MediaPlayer mp) {
                // TODO Auto-generated method stub
                mediaPlayer.setBackgroundResource(R.drawable.m_play);
                mp.stop();
                try {
                    mUpdateTimeTask.join();
                    mHandler.sendEmptyMessage(0);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                mHandler.removeCallbacks(mUpdateTimeTask);
            }
        });
        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

            public void onStopTrackingTouch(final SeekBar seekBar) {
                // TODO Auto-generated method stub
                //mHandler.removeCallbacks(mUpdateTimeTask);
                if(mp.isPlaying())
                {
                    int totalDuration = mp.getDuration();
                    int currentPosition = utils.progressToTimer(seekBar.getProgress(), totalDuration);
                    mp.seekTo(currentPosition);
                    mUpdateTimeTask = new Thread(new Runnable() {

                        public void run() {
                            // TODO Auto-generated method stub
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            long totalDuration = mp.getDuration();
                               long currentDuration = mp.getCurrentPosition();
                               int progress = (int)(utils.getProgressPercentage(currentDuration, totalDuration));
                               //timer.setText(""+utils.milliSecondsToTimer(currentDuration));
                               seekBar.setProgress(progress);
                               mHandler.post(this);
                        }
                    });
                    mUpdateTimeTask.start();
                }
                else
                {
                    seekBar.setProgress(0);
                }
            }

            public void onStartTrackingTouch(SeekBar seekBar) {
                // TODO Auto-generated method stub
                if(mp.isPlaying())
                {
                    mHandler.removeCallbacks(mUpdateTimeTask);
                }
                else
                {
                    seekBar.setProgress(0);
                }
            }

            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                // TODO Auto-generated method stub

            }
        });
        mp.setOnErrorListener(new OnErrorListener() {

            public boolean onError(MediaPlayer mp, int what, int extra) {
                // TODO Auto-generated method stub
                return false;
            }
        });

ありがとう...

4

1 に答える 1

0

現在の seekbarprogress をゼロに設定するメソッドを BaseAdapter に作成します

void setSeekBarValuetoZero(){  
    seekBar.setProgress(0);
}

シークバーが初期化されていることを確認してください。この関数は、mp.reset(); の前に yourMediaPlayer クラスから呼び出すことができます。

于 2012-10-17T16:25:17.463 に答える