2012-02-28 42 views
20

Tôi có một số SeekBar, nó hiển thị chính xác tiến trình MediaPlayer. Tuy nhiên, tôi gặp khó khăn khi tìm kiếm - nếu tôi tìm hộp cuộn ở đâu đó, nó chỉ trả về vị trí mà tập tin âm thanh đang phát.Android SeekBar để kiểm soát tiến trình MediaPlayer

public class EntityPageActivity extends Activity implements Runnable, OnClickListener, OnSeekBarChangeListener{ 
    private SeekBar seekBar; 
    private Button startMedia; 
    private Button pauseMedia; 
    private MediaPlayer mp; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.entity_page);    

     AudioControl();   

    } 

    public void AudioControl(){ 
     seekBar = (SeekBar) findViewById(R.id.seekBar); 
     startMedia = (Button) findViewById(R.id.play); 
     pauseMedia = (Button) findViewById(R.id.pause); 
     startMedia.setOnClickListener(this); 
     pauseMedia.setOnClickListener(this); 
    } 

    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; 
      }    
      seekBar.setProgress(currentPosition); 
     } 
    } 

    public void onClick(View v) { 
     if (v.equals(startMedia)) { 
      if (mp != null && mp.isPlaying()) return; 
      if(seekBar.getProgress() > 0) { 
       mp.start(); 
       return; 
      } 
      mp = MediaPlayer.create(EntityPageActivity.this, R.raw.gl1); 
      mp.start();      
      seekBar.setProgress(0); 
      seekBar.setMax(mp.getDuration()); 
      new Thread(this).start(); 
     } 

     if (v.equals(pauseMedia) && mp!=null) { 
      mp.pause(); 
     }  

    } 

    public void onStartTrackingTouch(SeekBar seekBar) { 
    } 

    public void onStopTrackingTouch(SeekBar seekBar) { 
    } 

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

    } 
} 

Như vậy, onProgressChanged là không đủ để cho phép SeekBar để kiểm soát MediaPlayer?

Tôi nên thêm/sửa điều gì để cho phép tìm kiếm?

Cảm ơn

CẬP NHẬT

tôi phát hiện ra rằng onProgressChanged không bao giờ được gọi bởi một số lý do. Tuy nhiên tôi không thể tìm ra lý do tại sao

+0

@llya Tôi có trình phát đa phương tiện nhưng phát bằng video và Hoạt động tốt, tôi có thể trợ giúp với bạn không? –

+0

Tôi nghĩ bạn biết rõ hơn bạn có thể giúp hay không) Nếu bạn cho rằng bạn biết cách quyết định vấn đề thì hãy thử trả lời –

+0

xem câu trả lời của tôi .............. –

Trả lời

10

Vấn đề là seekBar.setOnSeekBarChangeListener(this); Vì vậy, đặt nó trong AudioControl() Phương pháp ..... bạn không thiết lập oncheckchangedlistner để seekbar của bạn của bạn. ...

+0

Chính xác! Có vẻ như tôi vừa quên nó. Cảm ơn –

6

Hãy thử với đoạn mã sau:

public void onProgressChanged(SeekBar seekBar, int progress, 
      boolean fromUser) { 
     if(fromUser){ 
     mp.seekTo(progress); 
     seekbar.setProgress(progress);} 
} 
+0

'MediaPlayer' không' setProgress' phương pháp –

+0

seekbar.setProgress (tiến trình); – jyotiprakash

+0

Rất tiếc, nó không giúp được –

5

Bạn phải bao gồm các phương pháp tìm kiếm bên trong onCreate. Tôi đã có cùng một vấn đề, và nó đã làm việc sau đó.

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
if(fromUser){ 
    mediaPlayer.seekTo(progress); 
    seekBar.setProgress(progress); 
} 
0

Thử mã này trong phương thức onCreate() và chạy dự án.Tôi hy vọng điều này đang hoạt động.

seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
      mediaPlayer.seekTo(i); 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 

     } 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 

     } 
    }); 
0

Tôi đang sử dụng mã đơn giản này để thực hiện thủ thuật.

package in.bhartisoftwares.amit.allamitapps; 

import android.content.Context; 
import android.content.Intent; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.SeekBar; 
import android.widget.Toast; 

import java.util.Timer; 
import java.util.TimerTask; 

public class audioControllerTwo extends AppCompatActivity { 
    MediaPlayer mPlayer;   
    SeekBar audioTraverse; 

tại đây tôi đã xác định My SeekBar và MediaPlayer ở lớp công khai. Sau đó, trên phương pháp OnCreate tôi có mã như sau:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_audio_controller_two); 

    mPlayer = MediaPlayer.create(this, R.raw.song); 

Ở đây tôi tạo biến mPlayer, tìm tệp âm thanh của tôi có tên là "bài hát" có trong thư mục "thô".

Sau đó, tôi nắm lấy SeekBar tôi gọi là "audioTraverse" và gán nó vào "audioTraverse" biến và grabbing "Thời gian" của tập tin âm thanh và gán thời gian đó để "audioTraverse" tôi SeekBar như sau:

audioTraverse = (SeekBar) findViewById(R.id.audioTraverse); 
    audioTraverse.setMax(mPlayer.getDuration()); 

Bây giờ tôi đang chạy một bộ đếm thời gian sẽ chạy sau mỗi giây và nó sẽ cập nhật vị trí SeekBar cho phù hợp. Xem mã bên dưới:

new Timer().scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     audioTraverse.setProgress(mPlayer.getCurrentPosition()); 
    } 
},0, 1000); // here 0 represents first time this timer will run... In this case it will run after 0 seconds after activity is launched 
// And 1000 represents the time interval afer which this thread i.e., "run()" will execute. In this case, it will execute after every 1 second 

Bây giờ tôi thêm "SeekBarChangeListener", điều này sẽ tìm kiếm bất kỳ thay đổi nào trên SeekBar và trong "OnProgressChange()" phương pháp Tôi đang sử dụng ".seekTo()" phương pháp để đi đến một thời lượng cụ thể trong tệp âm thanh. Mã số như sau:

 audioTraverse.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 
       Log.i("Tranverse Change: ", Integer.toString(i)); 
       mPlayer.seekTo(i); 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 
    } 
} 
0

nếu bạn muốn tiếp tục trình phát phương tiện đến vị trí cụ thể từ tiến trình thay đổi thanh tìm kiếm, tôi khuyên bạn nên thực hiện điều đó trong phương thức onStopTrackingTouch().phương thức đó sẽ thông báo rằng người dùng đã hoàn thành một cử chỉ chạm, sau đó đặt vị trí trình phát media từ vị trí hiện tại của thanh tìm kiếm.

@Override 
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 

} 

@Override 
public void onStartTrackingTouch(SeekBar seekBar) { 

} 

@Override 
public void onStopTrackingTouch(SeekBar seekBar) { 
    mediaPlayer.seekTo(seekBar.getProgress()); 
} 
Các vấn đề liên quan