2013-04-22 7 views
5

Sto cercando di creare qualcosa in cui un singolo file audio viene riprodotto e può essere messo in pausa e manipolato con una barra di avanzamento/ricerca. Voglio avere un'immagine che occupa la maggior parte dello schermo e quindi un pulsante di pausa riproduzione in basso a sinistra e la barra a destra del pulsante. Tutto funziona con la barra di ricerca che non è collegata all'audio. La mia barra di avanzamento è probabilmente un pasticcio perché se presa da diversi ho visto su Internet, ma sono per lo più confusi per me come lo sono per le app di music player non per riprodurre un singolo file audio.Android SeekBar Audio

Qualcuno potrebbe aiutarmi con la barra di avanzamento? Anche altri suggerimenti su come migliorare la mia programmazione sarebbero fantastici.

(io sono molto nuovo per Android e la programmazione solo avvertirti)

Questo è il mio Java:

MediaPlayer mediaPlayer; 
    Button buttonPlayPause; 
    ImageView Image; 
    SeekBar seekBar; 

    private int stateMediaPlayer; 
    private final int stateMP_NotStarter = 0; 
    private final int stateMP_Playing = 1; 
    private final int stateMP_Pausing = 2; 
    int total; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.playerwere); 

     Image = (ImageView) findViewById(R.id.pdfview); 
     Image.setImageResource(R.drawable.wereim); 

     seekBar = (SeekBar) findViewById(R.id.seekBar); 

     buttonPlayPause = (Button) findViewById(R.id.playpause); 

     buttonPlayPause.setOnClickListener(buttonPlayPauseOnClickListener); 

     seekBar.setOnSeekBarChangeListener(seekBarOnSeekListener); 

     initMediaPlayer(); 

     Thread currentThread = new Thread(this); 
     currentThread.start(); 

    } 

    private void initMediaPlayer() { 
     mediaPlayer = new MediaPlayer(); 
     mediaPlayer = MediaPlayer.create(were.this, R.raw.were); 
     stateMediaPlayer = stateMP_NotStarter; 

     mediaPlayer.setOnPreparedListener(new OnPreparedListener() { 

      @Override 
      public void onPrepared(MediaPlayer arg0) { 
       // TODO Auto-generated method stub 
       total = mediaPlayer.getDuration(); 
      } 

     }); 

     seekBar.setProgress(0); 
     seekBar.setMax(total); 
    } 

    Button.OnClickListener buttonPlayPauseOnClickListener = new Button.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      switch (stateMediaPlayer) { 
      case stateMP_NotStarter: 
       mediaPlayer.start(); 
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_pause); 
       stateMediaPlayer = stateMP_Playing; 
       break; 
      case stateMP_Playing: 
       mediaPlayer.pause(); 
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_play); 
       stateMediaPlayer = stateMP_Pausing; 
       break; 
      case stateMP_Pausing: 
       mediaPlayer.start(); 
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_pause); 
       stateMediaPlayer = stateMP_Playing; 
       break; 
      } 

     } 
    }; 

    SeekBar.OnSeekBarChangeListener seekBarOnSeekListener = new SeekBar.OnSeekBarChangeListener() { 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, 
       boolean fromUser) { 
      // TODO Auto-generated method stub 

      if (fromUser) { 
       mediaPlayer.seekTo(progress); 
       seekBar.setProgress(progress); 
      } 

     } 
    }; 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

     try { 
      while (mediaPlayer != null) { 
       int currentPosition = mediaPlayer.getCurrentPosition(); 
       Message msg = new Message(); 
       msg.what = currentPosition; 
       threadHandler.sendMessage(msg); 
      } 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    private Handler threadHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      seekBar.setProgress(msg.what); 
     } 
    }; 

E questo è ciò che il mio Java è stato prima ho cercato di usare il seekBar:

MediaPlayer mediaPlayer; 
    Button buttonPlayPause; 
    ImageView Image; 

    private int stateMediaPlayer; 
    private final int stateMP_NotStarter = 0; 
    private final int stateMP_Playing = 1; 
    private final int stateMP_Pausing = 2; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.playerwere); 

     Image = (ImageView) findViewById(R.id.pdfview); 
     Image.setImageResource(R.drawable.wereim); 

     buttonPlayPause = (Button) findViewById(R.id.playpause); 

     buttonPlayPause.setOnClickListener(buttonPlayPauseOnClickListener); 

     initMediaPlayer(); 

    } 

    private void initMediaPlayer() { 
     mediaPlayer = new MediaPlayer(); 
     mediaPlayer = MediaPlayer.create(were.this, R.raw.were); 
     stateMediaPlayer = stateMP_NotStarter; 
    } 

    Button.OnClickListener buttonPlayPauseOnClickListener = new Button.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      switch (stateMediaPlayer) { 
      case stateMP_NotStarter: 
       mediaPlayer.start(); 
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_pause); 
       stateMediaPlayer = stateMP_Playing; 
       break; 
      case stateMP_Playing: 
       mediaPlayer.pause(); 
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_play); 
       stateMediaPlayer = stateMP_Pausing; 
       break; 
      case stateMP_Pausing: 
       mediaPlayer.start(); 
    buttonPlayPause.setBackgroundResource(android.R.drawable.ic_media_pause); 
       stateMediaPlayer = stateMP_Playing; 
       break; 
      } 

     } 
    }; 

Questa è la mia java dopo la risposta di Vishal Vaja:

MediaPlayer mediaPlayer; 
    Button buttonPlayPause; 
    ImageView Image; 
    SeekBar seekBar; 
    Handler handler; 

    private int stateMediaPlayer; 
    private final int stateMP_NotStarter = 0; 
    private final int stateMP_Playing = 1; 
    private final int stateMP_Pausing = 2; 
    private int mediaPos; 
    private int mediaMax; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.playerwere); 

     Image = (ImageView) findViewById(R.id.pdfview); 

     Image.setImageResource(R.drawable.wereim); 

     seekBar = (SeekBar) findViewById(R.id.seekBar); 

     buttonPlayPause = (Button) findViewById(R.id.playpause); 

     buttonPlayPause.setOnClickListener(buttonPlayPauseOnClickListener); 

     seekBar.setOnSeekBarChangeListener(seekBarOnSeekChangeListener); 

     initMediaPlayer(); 

    } 

    private void initMediaPlayer() { 
     handler = new Handler(); 
     mediaPlayer = new MediaPlayer(); 
     mediaPlayer = MediaPlayer.create(were.this, R.raw.were); 
     stateMediaPlayer = stateMP_NotStarter; 
     mediaPos = mediaPlayer.getCurrentPosition(); 

     mediaMax = mediaPlayer.getDuration(); 

     seekBar.setMax(mediaMax); // Set the Maximum range of the 
            // seekBar.setProgress(mediaPos);// set 
            // current progress to song's 

     handler.removeCallbacks(moveSeekBarThread); 
     handler.postDelayed(moveSeekBarThread, 100); 
    } 

    private Runnable moveSeekBarThread = new Runnable() { 

     public void run() { 
      if (mediaPlayer.isPlaying()) { 

       int mediaPos_new = mediaPlayer.getCurrentPosition(); 
       int mediaMax_new = mediaPlayer.getDuration(); 
       seekBar.setMax(mediaMax_new); 
       seekBar.setProgress(mediaPos_new); 

       handler.postDelayed(this, 100); // Looping the thread after 0.1 
               // second 
               // seconds 
      } 
     } 
    }; 

    Button.OnClickListener buttonPlayPauseOnClickListener = new Button.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      switch (stateMediaPlayer) { 
      case stateMP_NotStarter: 
       mediaPlayer.start(); 
       buttonPlayPause 
         .setBackgroundResource(android.R.drawable.ic_media_pause); 
       stateMediaPlayer = stateMP_Playing; 
       break; 
      case stateMP_Playing: 
       mediaPlayer.pause(); 
       buttonPlayPause 
         .setBackgroundResource(android.R.drawable.ic_media_play); 
       stateMediaPlayer = stateMP_Pausing; 
       break; 
      case stateMP_Pausing: 
       mediaPlayer.start(); 
       buttonPlayPause 
         .setBackgroundResource(android.R.drawable.ic_media_pause); 
       stateMediaPlayer = stateMP_Playing; 
       break; 
      } 

     } 
    }; 

    SeekBar.OnSeekBarChangeListener seekBarOnSeekChangeListener = new SeekBar.OnSeekBarChangeListener() { 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, 
       boolean fromUser) { 
      // TODO Auto-generated method stub 

      if (fromUser) { 
       mediaPlayer.seekTo(progress); 
       seekBar.setProgress(progress); 
      } 

     } 
    }; 

risposta

3

Penso che questo possa funzionare per voi.

Creare un thread che controllerà posizione della song e si sposterà SeekBar come questo,

private Runnable moveSeekBarThread = new Runnable() { 

    public void run() { 
     if(mediaPlayer.isplaying){ 

     int mediaPos_new = mediaPlayer.getCurrentPosition(); 
     int mediaMax_new = mediaPlayer.getDuration(); 
     seekBar.setMax(mediaMax_new); 
     seekBar.setProgress(mediaPos_new); 

     handler.postDelayed(this, 100); //Looping the thread after 0.1 second 
             // seconds 
     } 
    } 
}; 

E chiamare quel filo come questo,

mediaPos = mediaPlayer.getCurrentPosition(); 
    mediaMax = mediaPlayer.getDuration(); 

    seekBar.setMax(mediaMax); // Set the Maximum range of the 
    seekBar.setProgress(mediaPos);// set current progress to song's 

    handler.removeCallbacks(moveSeekBarThread); 
    handler.postDelayed(moveSeekBarThread, 100); 
+0

Ok, ho provato, ma non credo che ho messo nel posto giusto perché ora quando l'audio viene riprodotto il bar ancora non si muove, ma se io muovi la barra di ricerca che l'audio cerca. Ho inserito il mio nuovo codice nella domanda originale – user2305722

0

public class DetailMusic estende attrezzi di attività View.OnClickListener {

SeekBar seek_bar; 
Button play_button, pause_button; 
TextView text_shown; 
Handler seekHandler = new Handler(); 
Bundle bundle = new Bundle(); 
String Musicnames; 
int mediaMax; 
int mediaPos = 0; 
MediaPlayer mp = new MediaPlayer(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_detailmusic); 
    bundle = getIntent().getExtras(); 
    if (bundle != null) { 
     Musicnames = bundle.getString("musicnbames"); 
     System.out.println("++++++++++++++++++++++++++++++++" + Musicnames); 
     Log.e("musicfoldername", Musicnames); 
    } 
    seek_bar = (SeekBar) findViewById(R.id.seek_bar); 
    play_button = (Button) findViewById(R.id.play_button); 
    pause_button = (Button) findViewById(R.id.pause_button); 
    text_shown = (TextView) findViewById(R.id.text_shown); 
    play_button.setOnClickListener(this); 
    pause_button.setOnClickListener(this); 
    //seekUpdation(); 

    String PATH_TO_FILE = Musicnames; 
    // MediaPlayer mp = new MediaPlayer(); 
    try { 
     mp.setDataSource(PATH_TO_FILE); 
     mp.prepare(); 
    } catch (IOException e) { 

    } 
    mp.start(); 
    seek_bar.setMax(mp.getDuration()); 

    try { 
     mp.setDataSource(Musicnames); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    mediaPos = mp.getCurrentPosition(); 
    mediaMax = mp.getDuration(); 
    seek_bar.setMax(mediaMax); // Set the Maximum range of the 
    seek_bar.setProgress(mediaPos);// set current progress to song's 
    seekHandler.removeCallbacks(moveSeekBarThread); 
    seekHandler.postDelayed(moveSeekBarThread, 100); //cal the thread after 100 milliseconds 

} 

private Runnable moveSeekBarThread = new Runnable() { 
    public void run() { 
     if (mp.isPlaying()) { 
      int mediaPos_new = mp.getCurrentPosition(); 
      int mediaMax_new = mp.getDuration(); 
      seek_bar.setMax(mediaMax_new); 
      seek_bar.setProgress(mediaPos_new); 
      seekHandler.postDelayed(this, 100); //Looping the thread after 0.1 second 
     } 
    } 
}; 


@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.play_button: 
      mp.reset(); 

// mp.start(); text_shown.setText ("Riproduzione in corso ...");

  break; 
     case R.id.pause_button: 
      mp.pause(); 
      text_shown.setText("Paused..."); 
    } 
} 

}