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()方法永远不会被调用。而是在主线程中创建一个Handler对象(您已经这样做了,但它未使用),Thread.sleep()从 run 方法中删除,但postDelayed()在末尾添加对 Handler 方法的调用run()(并且可能是仅在播放时调用它的条件)。

开始播放后,调用一次 run() 方法(从主线程)。然后它会注意随后用postDelayed().

于 2013-05-27T17:32:43.227 回答