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);
}
}
したがって、onProgressChanged
はSeekBar
がMediaPlayer
を制御できるようにするのに十分ではありませんか?
シークを許可するには何を追加/修正する必要がありますか?
ありがとう
[〜#〜]更新[〜#〜]
onProgressChanged
が何らかの理由で呼び出されないことを知りました。しかし、なぜなのかわからない
問題はseekBar.setOnSeekBarChangeListener(this);
なので、AudioControl()
メソッドに配置します..... oncheckchangedlistner
をシークバーに設定しないでください...
次のコードで試してください:
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
if(fromUser){
mp.seekTo(progress);
seekbar.setProgress(progress);}
}
onCreate
内にseekbarメソッドを含める必要があります。私も同じ問題を抱えていましたが、その後はうまくいきました。
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(fromUser){
mediaPlayer.seekTo(progress);
seekBar.setProgress(progress);
}
私はトリックを行うためにこの単純なコードを使用しています。
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;
ここでは、パブリッククラスでMy 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変数を作成しています。この変数は、「raw」フォルダにある「song」というオーディオファイルを検索します。
次に、 "audioTraverse"という名前のSeekBarを取得し、それを "audioTraverse"変数に割り当て、オーディオファイルの "Duration"を取得し、その期間を "audioTraverse" SeekBarに次のように割り当てます。
audioTraverse = (SeekBar) findViewById(R.id.audioTraverse);
audioTraverse.setMax(mPlayer.getDuration());
今、私は毎秒実行されるタイマーを実行していて、それに応じて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
ここで「SeekBarChangeListener」を追加します。これにより、SeekBarでの変更が検索され、「OnProgressChange()」メソッドで「.seekTo()」メソッドを使用して、オーディオファイルの特定のデュレーションに移動します。コードは次のとおりです。
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) {
}
});
}
}
このコードを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) {
}
});
シークバーの変更の進行状況からメディアプレーヤーを特定の位置に再開する場合は、onStopTrackingTouch()メソッドで再開することをお勧めします。このメソッドは、ユーザーがタッチジェスチャーを終了したことを通知し、シークバーの現在の位置からメディアプレーヤーの位置を設定します。
@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());
}