0

onCreate でランダムなサウンドを再生するように設定しました。オーディオを追跡するためにシークバーを追加する必要があります。トラックと一緒に移動しますが、シークバーがオーディオの別の部分に引き戻されても戻りません。どんな助けでも素晴らしいでしょう、初心者だけです、初心者で申し訳ありません:)。

 public class player1 extends Activity implements Runnable {


private  MediaPlayer mp;
// Handler to update UI timer, progress bar etc,.
private Handler mHandler = new Handler();;
private Utilities utils;
private int seekForwardTime = 5000; // 5000 milliseconds
private int seekBackwardTime = 5000; // 5000 milliseconds
private int currentSongIndex = 0; 
private SeekBar songProgressBar;
private ImageButton playicon;
private ImageButton pauseicon;
private TextView songCurrentDurationLabel;
private TextView songTotalDurationLabel;
private final int NUM_SOUND_FILES = 3;  //*****REPLACE THIS WITH THE ACTUAL NUMBER OF SOUND FILES YOU HAVE*****
private SeekBar seek;
private int mfile[] = new int[NUM_SOUND_FILES];
private Random rnd = new Random();


   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.player_1);
        songProgressBar = (SeekBar) findViewById(R.id.songProgressBar);
        songTotalDurationLabel = (TextView) findViewById(R.id.songTotalDurationLabel);
        songCurrentDurationLabel = (TextView) findViewById(R.id.songCurrentDurationLabel);
        pauseicon = (ImageButton) findViewById(R.id.pauseicon);
        getActionBar().setDisplayHomeAsUpEnabled(true);


        mfile[0] = R.raw.sound01;  //****REPLACE THESE WITH THE PROPER NAMES OF YOUR SOUND FILES
        mfile[1] = R.raw.sound02;  //PLACE THE SOUND FILES IN THE /res/raw/ FOLDER IN YOUR PROJECT*****
        mfile[2] = R.raw.sound03;
        // Listeners
        /**
         * Play button click event
         * plays a song and changes button to pause image
         * pauses a song and changes button to play image
         * */


        try{
             mp = MediaPlayer.create(player1.this, mfile[rnd.nextInt(NUM_SOUND_FILES)]);
             mp.seekTo(0);
             mp.start(); 
             // set Progress bar values
                songProgressBar.setProgress(0);
                songProgressBar.setMax(mp.getDuration());
                new Thread(this).start();


         } catch (IllegalArgumentException e) {
             e.printStackTrace();
         } catch (IllegalStateException e) {
             e.printStackTrace();
         }


        pauseicon.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                 if (v.getId() == R.id.pauseicon)
        if(mp.isPlaying()){
            mp.pause();
          ImageButton pauseicon =(ImageButton) findViewById(R.id.pauseicon);

          pauseicon.setImageResource(R.drawable.playicon);
        } else {
            mp.start();

                 ImageButton pauseicon =(ImageButton) findViewById(R.id.pauseicon);

                 pauseicon.setImageResource(R.drawable.pauseicon);


            }}});
   }


    public void run() {
        int currentPosition= 0;
        int total = mp.getDuration();
        while (mp!=null && currentPosition<total) {
            try {
                Thread.sleep(1000);
                currentPosition= mp.getCurrentPosition();
            } catch (InterruptedException e) {
                return;
            } catch (Exception e) {
                return;
            }            
            songProgressBar.setProgress(currentPosition);
        }
    }



    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    public void onStopTrackingTouch(SeekBar seekBar) {
    }

    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        if(fromUser) mp.seekTo(progress);

    }



    public boolean onOptionsItemSelected(MenuItem item){
        Intent myIntent = new Intent(getApplicationContext(), MainActivity.class);
        startActivityForResult(myIntent, 0);
        return true;
        }
    }
4

1 に答える 1

0

run()メソッドが呼び出されることはありません。代わりに、メイン スレッドでオブジェクトを作成し(既に行っていますが、使用されていません)、 run メソッドからHandlerを削除しますが、最後に Handler のメソッドへの呼び出しを追加します(おそらく、再生中にのみ呼び出す条件を追加します)。Thread.sleep()postDelayed()run()

再生を開始した後、(メインスレッドから) run() メソッドを 1 回呼び出します。その後、 で自分自身を呼び出すことに注意しpostDelayed()ます。

于 2013-05-27T17:32:43.227 に答える