Android媒体播放器没有完全进展

时间:2013-04-25 06:08:35

标签: android file android-mediaplayer progress wave

我尝试使用媒体播放器播放.wav文件。实际上,到目前为止,我已经完成了以下所示。它正在正确地更新进度,但问题媒体播放器并没有完全寻求。媒体播放器停止在文件的总持续时间之前发出进度并停止更新进度。我也实现了OnComplete监听器也没有得到回调。这是我的代码,任何人都可以发现我失踪的地方。

public void playAudioFile() {
    try {

        mMediaPlayer.reset();
        setMediaPlayerSource();
        mMediaPlayer.prepare();
        mMediaPlayer.start();
        mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer arg0) {
                Graphbar.setProgress(mMediaPlayer.getDuration());
            }
        });
        bPlay.setBackgroundResource(R.drawable.pause_selector);

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Playing");
                updateProgressBar();
            }
        }).start();

    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
    public void updateProgressBar() {
    Graphbar.setProgress(0);

    Graphbar.setMax(mMediaPlayer.getDuration());
    mHandler.postDelayed(mUpdateTimeTask, 0);
}
private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {
        if(mMediaPlayer.isPlaying()){
        long totalDuration = Graphbar.getMax();
        long currentDuration =mMediaPlayer.getCurrentPosition();

        String TotalDur = Utilities.milliSecondsToTimer(totalDuration);

        tvTimeRight.setText(TotalDur);
        tvTimeLeft.setText(""+ Utilities.milliSecondsToTimer(currentDuration));

        System.out.println(currentDuration+"/"+totalDuration);
        Graphbar.setProgress((int)currentDuration); 
        mHandler.postDelayed(this, 1);
        }
    }
};
private void setMediaPlayerSource() {
        String audioFile = getFilename();
        try {
            mMediaPlayer.setDataSource(audioFile);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:0)

总持续时间使用mediaplayer.getduration。 从可运行的处理程序中删除不必要的代码,因为它会为您的搜索栏创建加载。因为每秒你正在根据计算计算某些内容和更新布局

我建议你使用android的天文台视图。

public void playAudioFile() {
    try {

        mMediaPlayer.reset();
        setMediaPlayerSource();
        mMediaPlayer.prepare();
        mMediaPlayer.start();
        mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {

            @Override
            public void onCompletion(MediaPlayer arg0) {
                Graphbar.setProgress(mMediaPlayer.getDuration());
            }
        });
        bPlay.setBackgroundResource(R.drawable.pause_selector);
        //set this only for once , because for one song total duration is always constant.

     updateProgressBar();
}
    public void updateProgressBar() {
    Graphbar.setProgress(0); 

    Graphbar.setMax(mMediaPlayer.getDuration());
    mHandler.postDelayed(mUpdateTimeTask, 0);

    long totalDuration = mMediaPlayer.getDuration();
    String TotalDur = Utilities.milliSecondsToTimer(totalDuration);

        tvTimeRight.setText(TotalDur);
}
private Runnable mUpdateTimeTask = new Runnable() {
    public void run() {

        if(mMediaPlayer.isPlaying()){
        //long totalDuration = mMediaPlayer.getDuration();=> no need of calculating total time and updating it to seekbar at every second 

        long currentDuration =mMediaPlayer.getCurrentPosition();


        tvTimeLeft.setText(""+ Utilities.milliSecondsToTimer(currentDuration));

        System.out.println(currentDuration+"/"+totalDuration);
        Graphbar.setProgress((int)currentDuration); 
        mHandler.postDelayed(this, 1);
        }
    }
};
private void setMediaPlayerSource() {
        String audioFile = getFilename();
        try {
            mMediaPlayer.setDataSource(audioFile);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }