2012-02-28 8 views
20

私はSeekBarを持っていますが、これは正しくMediaPlayerの進行を表示します。しかし、私は探していると困っています。もしどこかでスクロールボックスを探しても、オーディオファイルが再生されている位置に戻ってしまいます。MediaPlayerの進行を制御するためのAndroid SeekBar

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); 

    } 
} 

したがって、onProgressChangedSeekBarMediaPlayerを制御することを可能にするのに十分ではありませんか?

シークを許可するにはどうすればよいですか?

おかげ

UPDATE

は私がonProgressChangedが何らかの理由によって呼び出されないことが分かりました。

+0

@llya私はビデオとメディアプレイヤーが、その遊びを持っていると私はあなたを助けるかもしれ罰金作品? –

+0

私はあなたが助けてくれるかどうか分かっていると思います)あなたが問題を決める方法を知っているとお考えなら、答えを教えてください –

+0

私の答えを見てください.............. –

答えて

10

問題は、だから、あなたはあなたのシークバーにoncheckchangedlistnerを設定していけない.....あなたのAudioControl()方法で を入れseekBar.setOnSeekBarChangeListener(this);です。 ...

+0

まさに!私はちょうどそれを忘れたようです。ありがとう –

6

は、次のコードで試してみてくださいなぜしかし、私は理解することはできません。

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

'MediaPlayer'は' setProgress'メソッドを持っていません –

+0

seekbar.setProgress(progress); – jyotiprakash

+0

残念ながらそれは助けなかった –

5

onCreateの中にシークバーメソッドを含める必要があります。私は同じ問題を抱えていましたが、それはその後に働きました。

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

このコードを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) { 

     } 
    }); 
0

私はトリックを行うために、この単純なコードを使用しています。

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の変数を、作成しています。

それから私は「audioTraverse」と呼ばれ、次のようにシークバー「audioTraverse」変数とオーディオファイルの「継続時間」をつかみ、私の「audioTraverse」にその期間を割り当てるためにそれを割り当てられた私のシークバーをつかん:

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

今私は毎秒実行されるタイマーを実行しているので、それに応じてSeekBarの位置が更新されます。以下のコードを参照してください。今、私は「SeekBarChangeListener」を追加してい

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 

を、これはシークバーで変更のため、私はに行く「.seekTo()」メソッドを使用しています「OnProgressChange()」メソッドを検索しますオーディオファイルの特定の期間。次のようにコードがある:あなたがシークバー変更の進捗状況から特定の位置にメディアプレーヤーを再開したい場合は

 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

、私は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()); 
} 
関連する問題