2011-03-10 63 views
1

我已經構建了自定義媒體播放器,並且還想顯示seekbar。 搜索欄現在正在顯示,但不起作用,即播放歌曲時沒有進行。讓我知道我在哪裏錯了。以下是代碼如何顯示seekbar以及自定義媒體播放器

public class myPlayer extends Activity implements Runnable,SeekBar.OnSeekBarChangeListener { 

    MediaPlayer mPlayer; 
    Button play,stop; 
    SeekBar seekbar; 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     seekbar = (SeekBar)findViewById(R.id.seekbar); 
     mPlayer = MediaPlayer.create(this,R.raw.sajnave); 
     play=(Button)findViewById(R.id.play); 
     stop=(Button)findViewById(R.id.stop); 
     Toast.makeText(myPlayer.this, ""+mPlayer.getDuration(), Toast.LENGTH_SHORT).show(); 

     play.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       mPlayer.start(); 

      } 

     }); 

     stop.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Toast.makeText(myPlayer.this, ""+mPlayer.getCurrentPosition(), Toast.LENGTH_SHORT).show(); 
       mPlayer.stop(); 
      } 

     }); 
    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     int currentPosition = 0; 

       int total = mPlayer.getDuration(); 

       seekbar.setMax(total); 

       while (mPlayer != null && currentPosition < total) { 

        try { 

         Thread.sleep(1000); 

         currentPosition = mPlayer.getCurrentPosition(); 

        } catch (InterruptedException e) { 

         return; 

        } catch (Exception e) { 

         return; 

        } 

        seekbar.setProgress(currentPosition); 

       } 

    } 

    @Override 
    public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) { 
     // TODO Auto-generated method stub 
     mPlayer.seekTo(arg1); 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     // TODO Auto-generated method stub 

    } 

} 

回答

3

呼叫updatePosition()方法mediplayer starts..It對我的作品後。

private final Handler handler = new Handler(); 

private final Runnable updatePositionRunnable = new Runnable() { 
    public void run() { 
     updatePosition(); 
    } 
}; 

private void updatePosition() { 
    handler.removeCallbacks(updatePositionRunnable); 
    if (player != null) seekbar.setProgress(player.getCurrentPosition()); 

    handler.postDelaye(updatePositionRunnable, 500); 

} 
@Override 
public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) { 
    // TODO Auto-generated method stub 
    player.seekTo(arg1); 
} 

@Override 
public void onStartTrackingTouch(SeekBar seekBar) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStopTrackingTouch(SeekBar seekBar) { 
    // TODO Auto-generated method stub 

} 
+1

我認爲,這將是更好的修改onProgressChanged方法一點點: @Override 公共無效onProgressChanged(搜索欄爲arg0,INT prgress,布爾FROMUSER){ 如果(FROMUSER) player.seekTo(進度); } 如果沒有條件,你會感覺到聲音保持暫停並在播放時再次播放。 – sunghun 2013-06-18 23:28:42

1
SurfaceView mPreview=(SurfaceView)findViewById(R.id.surface);  
mPreview.postDelayed(runnable,200);  
Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
     if (mMediaPlayer != null) { 
      if (isPlaying) { 
       // converting current position into seconds so dividing by 
       // 1000 
       try { 
        currentPosition = mMediaPlayer.getCurrentPosition(); 
        mVideoProgress 
          .setProgress((int) ((currentPosition/(float) mMediaPlayer 
            .getDuration()) * 100f)); 

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

       mPreview.postDelayed(runnable, 150); 
      } 
     } 

    } 
}; 
+0

Mohit,你可能會把你的前3行代碼視圖,這可能會更好,更具可讀性。 – 2011-03-22 09:25:24

相關問題