Android SeekBar控制MediaPlayer进程
我有一个Android SeekBar控制MediaPlayer进程,android,media-player,seekbar,seek,Android,Media Player,Seekbar,Seek,我有一个SeekBar,它正确显示MediaPlayer进度。然而,我在搜索时遇到了麻烦——如果我在某个地方搜索滚动框,它只会返回到播放音频文件的位置 public class EntityPageActivity extends Activity implements Runnable, OnClickListener, OnSeekBarChangeListener{ private SeekBar seekBar; private Button startMedia;
SeekBar
,它正确显示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);
}
}
公共类EntityPageActivity扩展活动实现可运行、OnClickListener、OnSeekbarchangListener{
私人SeekBar SeekBar;
私人按钮开始媒体;
私人按钮暂停媒体;
私人媒体播放器;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.entity_页面);
音频控制();
}
公共音频控制(){
seekBar=(seekBar)findViewById(R.id.seekBar);
startMedia=(按钮)findViewById(R.id.play);
pauseMedia=(按钮)findViewById(R.id.pause);
startMedia.setOnClickListener(此);
pauseMedia.setOnClickListener(此);
}
公开募捐{
int currentPosition=0;
int total=mp.getDuration();
while(mp!=null&¤tPosition 0){
mp.start();
返回;
}
mp=MediaPlayer.create(EntityPageActivity.this,R.raw.gl1);
mp.start();
seekBar.setProgress(0);
seekBar.setMax(mp.getDuration());
新线程(this.start();
}
如果(v.equals(pauseMedia)&&mp!=null){
mp.pause();
}
}
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
}
更改了公共进程无效(SeekBar SeekBar,int progress,
布尔值(用户){
如果(来自用户)mp.seekTo(进度);
}
}
因此,onProgressChanged
不足以允许SeekBar
控制MediaPlayer
我应该添加/更正什么以允许查找
谢谢
更新
我发现,
onProgressChanged
从来没有因为某种原因被调用过。但是,我不明白为什么要尝试以下代码:
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if(fromUser){
mp.seekTo(progress);
seekbar.setProgress(progress);}
}
问题是
seekBar.setonseekbarchaneglistener(这个)代码>所以把它放在你的AudioControl()
方法中。。。。。
您不需要将oncheckchangedlistner
设置到seekbar…您必须在onCreate
中包含seekbar方法。我也有同样的问题,从那以后它就起作用了
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(fromUser){
mediaPlayer.seekTo(progress);
seekBar.setProgress(progress);
}
在onCreate()方法中尝试这段代码并运行该项目。我希望这能起作用
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) {
}
});
我使用这个简单的代码来实现这个技巧
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;
在这里,我在公共类中定义了我的SeekBar和MediaPlayer。然后在OnCreate方法上,我有如下代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_audio_controller_two);
mPlayer = MediaPlayer.create(this, R.raw.song);
在这里,我创建了一个mPlayer变量,用于查找名为“song”的音频文件,该文件位于“raw”文件夹中
然后我抓取名为“audioTraverse”的SeekBar并将其分配给“audioTraverse”变量,然后抓取音频文件的“持续时间”,并将该持续时间分配给我的“audioTraverse”SeekBar,如下所示:
audioTraverse = (SeekBar) findViewById(R.id.audioTraverse);
audioTraverse.setMax(mPlayer.getDuration());
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) {
}
});
}
}
现在我正在运行一个计时器,它将在每秒钟后运行,并相应地更新SeekBar位置。请参阅下面的代码:
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
现在我添加了“seekbarchaneglistener”,这将查找SeekBar上的任何更改,以及我正在使用的“.seekTo()”方法中的“OnProgressChange()”中的任何更改,以转到音频文件中的特定持续时间。代码如下:
audioTraverse = (SeekBar) findViewById(R.id.audioTraverse);
audioTraverse.setMax(mPlayer.getDuration());
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) {
}
});
}
}
如果您想将媒体播放器从seekbar change progress恢复到特定位置,我建议您使用onStopTrackingTouch()方法。该方法将通知用户已完成触摸手势,然后从seekbar的当前位置设置媒体播放器位置
@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());
}
MediaPlayer
没有setProgress
methodseekbar.setProgress(progress)@llya我有媒体播放器,但它可以播放视频,工作正常。我可以帮你吗?我想你知道得更清楚,你能帮我吗?不可以)如果你认为你知道如何解决问题,然后试着回答我建议你在onStopTrackingTouch()方法中加入mp.seekTo(progress),因为你需要的是将搜索栏滚动到特定位置,然后设置媒体播放器进度=seekbar进度。请在下面核对我的答案……完全正确!我好像忘了。谢谢