Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SeekBar控制MediaPlayer进程_Android_Media Player_Seekbar_Seek - Fatal编程技术网

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进度。请在下面核对我的答案……完全正确!我好像忘了。谢谢