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

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 に答える