2012-02-28 10 views
20

Mam SeekBar, wyświetla prawidłowo postęp MediaPlayer. Mam jednak kłopot z poszukiwaniem - jeśli szukam gdzieś pola przewijania, to po prostu wróci na pozycję, w której odtwarzany jest plik audio.Android SeekBar do sterowania postępem 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); 

    } 
} 

Zatem onProgressChanged nie wystarcza, aby umożliwić SeekBar kontrolować MediaPlayer?

Co należy dodać/poprawić, aby umożliwić wyszukiwanie?

Dzięki

UPDATE

I okazało się, że onProgressChanged nigdy nie jest wywoływana przez jakiegoś powodu. Jednak nie mogę zrozumieć dlaczego

+0

@llya Mam odtwarzacz multimedialny, ale jego gra z wideo i działa dobrze może mogę pomóc z tobą? –

+0

Myślę, że wiesz lepiej, czy możesz pomóc, czy nie) Jeśli podejmiesz decyzję o problemie, spróbuj podać odpowiedź: –

+0

zobacz moją odpowiedź .............. –

Odpowiedz

10

Problemem jest seekBar.setOnSeekBarChangeListener(this); więc umieścić go w AudioControl() Metoda ..... dont ustawiony oncheckchangedlistner do SeekBar. ...

+0

Dokładnie! Wygląda na to, że po prostu o tym zapomniałem. Dzięki –

6

Spróbuj z następującego kodu:

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

'MediaPlayer' nie ma metody' setProgress' –

+0

seekbar.setProgress (progress); – jyotiprakash

+0

Niestety to nie pomogło –

5

Musisz uwzględnić metody wyszukiwania w obszarze onCreate. Miałem ten sam problem i zadziałało to później.

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

Wypróbuj ten kod w onCreate() i uruchom projekt. Mam nadzieję, że to działa.

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

Używam tego prostego kodu, aby załatwić sprawę.

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; 

tutaj zdefiniowałem My SeekBar i MediaPlayer w klasie publicznej. Następnie na Metodzie OnCreate mam kod jak poniżej:

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

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

Tutaj tworzę MPlayer zmienna, że ​​znajdzie mój plik dźwiękowy o nazwie „piosenka”, który jest obecny w folderze „raw”.

Potem chwycił mnie SeekBar nazwie „audioTraverse” i przypisać go do „audioTraverse” zmienna i chwytając „Czas trwania” pliku audio i przypisanie tego okresu do mojego „audioTraverse” SeekBar następująco:

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

Teraz uruchamiam programator, który będzie uruchamiany po każdej sekundzie i odpowiednio zaktualizuje pozycję SeekBar. Zobacz poniższy kod:

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 

Teraz dodaję „SeekBarChangeListener”, to będzie szukał wszelkich zmianach dotyczących SeekBar oraz w „OnProgressChange()” metoda używam „.seekTo()” metoda, aby przejść do określony czas trwania w pliku audio. Kod jest następujący:

 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

jeśli chcesz wznowić odtwarzacz multimedialny do określonej pozycji od postępu zmian SeekBar, polecam zrobić tę metodę w onStopTrackingTouch().ta metoda powiadomi użytkownika, że ​​zakończył gest dotykowy, a następnie ustaw pozycję odtwarzacza multimedialnego z aktualnej pozycji apletu wyszukiwania.

@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()); 
} 
Powiązane problemy