2011-06-01 155 views
2

我使用下面的代码播放录制的音频文件,它工作正常。我有一个显示比赛进程的搜索栏。我有两个静态文本称为开始和结束。我需要在开始文本中显示播放的持续时间(00.00到最大持续时间),并将时间从最大持续时间递减到00.00。我需要显示进展时间,剩余时间...任何建议..显示播放时间,播放剩余时间

 
private void playAudio() { 
     // TODO Auto-generated method stub 
     start.setVisibility(View.VISIBLE); 
     end.setVisibility(View.VISIBLE); 
     Context context = getApplicationContext(); 
     CharSequence text1 = "Your audio will play"; 
     int duration = Toast.LENGTH_SHORT; 
     Toast toast1 = Toast.makeText(context, text1, duration); 
     toast1.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
     toast1.show();

String newFolderName = "/ComAudioRecorder"; String extstoredir = Environment.getExternalStorageDirectory() .toString(); String filename = "/combinedrecaudio.wav"; String path1 = extstoredir + newFolderName + filename; Log.d("path1", path1); /* * String path=path2; Log.d("path",path); */ mPlayer = new MediaPlayer(); try { mPlayer.setDataSource(path1); mPlayer.prepare(); mPlayer.start(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mSeekBar.setMax(mPlayer.getDuration()); new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (mPlayer != null && mPlayer.getCurrentPosition() < mPlayer.getDuration()) { Log.d("Indide Run Method",Integer.toString(mPlayer.getCurrentPosition())); try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } mSeekBar.setProgress(mPlayer.getCurrentPosition()); start.setText(Long.toString(startTime)); //end.setText(Double.toString()); } } }).start(); pos=mPlayer.getCurrentPosition(); mSeekBar.setProgress(mPlayer.getCurrentPosition()); // mPlay.setVisibility(View.INVISIBLE); pauseRecord.setVisibility(View.INVISIBLE); resumeRec.setVisibility(View.VISIBLE); /*start.setText(Double.toString(starttext)); starttext=starttext+00.01;*/ // start.setText((int) (mPlayer.getCurrentPosition()/100000.0)); // end.setText(currentTime); // start.setText(); // mDelete.setVisibility(View.INVISIBLE); }

回答

3

您无法更新线程中的用户界面,您可以将它们发布到Runnable。

在运行方法()中输入以下代码。

mHandler.post(updateUI); 

然后使用处理程序来更新

private final Runnable updateUI= new Runnable() 
     { 
      public void run() 
      { 
       try 
       { 
        //update ur ui here  
         start.setText((mPlayer.getCurrentPosition()/mPlayer.getDuration())*100); ‌​ end.setText(mPlayer.getDuration()-mPlayer.getCurrentPosition()) 

       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     private final Handler mHandler = new Handler(); 
3

为每1秒,你可以用公式更新进度条(mPlayer.getCurrentPosition()/mPlayer.getDuration)*100;

同样可以得到剩余时间通过使用mPlayer.getDuration-mPlayer.getCurrentPosition();

你可以在onPreparedListener让您的音频文件的getDuration()...

得到了成功的让我知道。

+0

我用这显示错误公共无效的run(){\t \t \t \t 而UI(MPLAYER!= NULL \t && mPlayer.getCurrentPosition()< mPlayer.getDuration()){Log.d(“Indide Run Method”,Integer.toString(mPlayer.getCurrentPosition())); \t \t \t \t \t尝试{ \t \t \t \t \t \t的Thread.sleep(100); \t \t \t \t \t}赶上(InterruptedException的发送){ \t \t \t \t \t \t // TODO自动生成的catch程序块 \t \t \t \t \t \t e.printStackTrace(); \t \t \t \t \t} \t \t \t \t \t mSeekBar.setProgress(mPlayer.getCurrentPosition()); \t \t \t \t \t start.setText((mPlayer.getCurrentPosition()/ mPlayer.getDuration())* 100); \t \t \t \t \t \t \t end.setText(mPlayer.getDuration() - mPlayer。getCurrentPosition()); 。 \t \t \t \t \t} \t \t \t \t \t} \t \t})开始(); – Manikandan 2011-06-01 13:17:50

+0

我应该在哪里放置这些线程或线程外..你可以请更新与我的代码相关的答案。 – Manikandan 2011-06-01 17:43:44

+0

谢谢,它的工作原理。但是,当搜索栏移动时,开始文本不会更新。仅显示0。在播放结束时,文本始终变为100,即使播放时间更长。 – Manikandan 2011-06-02 09:59:43

相关问题