1

我已经为此工作了一段时间,试图让本教程工作(http://united-coders.com/nico-heid/an-android-seekbar-for-your-mediaplayer/),但我没有没有运气。音频播放完美,但 SeekBar 不动。

package com.example.playingaudio;

import java.io.FileInputStream;

import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.SeekBar;

public class MainActivity extends Activity implements Runnable {

    private MediaPlayer mediaPlayer;
    private SeekBar progress;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        setContentView(R.layout.activity_main);
        super.onCreate(savedInstanceState);
        progress = (SeekBar) findViewById(R.id.seekBar1);

    }

    public void playButton(View view) {
        try {
            playRecording();

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    protected void playRecording() throws Exception {
        final MediaPlayer mediaPlayer = new MediaPlayer();
        FileInputStream fileStream = new FileInputStream(
                "/sdcard/Download/mySong.mp3");
        mediaPlayer.setDataSource(fileStream.getFD());
        mediaPlayer.prepare(); // might take long! (for buffering, etc)
        mediaPlayer.start();
        run();
    }

    private void ditchMediaPlayer() {
        if (mediaPlayer != null) {
            try {
                mediaPlayer.release();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    public void run() {
        // mp is your MediaPlayer
        // progress is your ProgressBar

        int currentPosition = 0;
        int total = mediaPlayer.getDuration();
        progress.setMax(total);
        while (mediaPlayer != null && currentPosition < total) {
            try {
                Thread.sleep(1000);
                currentPosition = mediaPlayer.getCurrentPosition();
            } catch (InterruptedException e) {
                return;
            } catch (Exception e) {
                return;
            }
            progress.setProgress(currentPosition);
        }
    }

}
4

2 回答 2

1

尝试更改此行

final MediaPlayer mediaPlayer = new MediaPlayer();

到,这条线

mediaPlayer = new MediaPlayer();

原因是您已经声明了一个类变量 mediaPlayer,为什么还要用相同的名称再次声明局部变量。

于 2013-08-06T03:40:54.397 回答
0

您的酒吧没有更新的原因是因为您没有给它机会。您的 UI 线程上有一个持续循环,主要由sleep(). 您不能这样做并期望 UI 会更新。

如果您更仔细地查看该教程,您会发现他们没有调用runOnUiThread(). 事实上,在底部有一个返回 SO 的链接,它显示了更多涉及的代码。刚刚Thread创建了一个新的,并且start()正在运行。没什么太棘手的。


例子:

(之后调用此方法mediaPlayer.start()):

private void createProgressThread() {   
    progressUpdater = new Runnable() {
        @Override
        public void run() {
            //...
            //...
        }
    };
    Thread thread = new Thread(progressUpdater);
    thread.start();
}
于 2013-08-06T00:45:50.937 回答