2017-07-20 6 views
-1

Je développe une application MusicPlayer simple en utilisant ListView.Suivant Button MusicPlayer Android

Il existe deux classes: MainActivity et MediaCursorAdapter.

Le curseur est formé à l'aide de getContentResolver() dans la classe MainActivity et transmis à l'adaptateur où la liaison de données a lieu.

Maintenant, au clic du bouton Suivant je veux jouer la chanson suivante. Mais incapable de trouver un moyen de le faire.

** Le commentaire montre où je suis en train de mettre cela en: // besoin de jouer le morceau suivant ici

MediaCursorAdapter.java

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    //TextView title = (TextView) view.findViewById(R.id.title_name); 
    TextView displayName = (TextView) view.findViewById(R.id.display_name); 
    TextView duration = (TextView) view.findViewById(R.id.duration); 
    String nameOfTheSong = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)); 
    nameOfTheSong = nameOfTheSong.substring(0,nameOfTheSong.length()-4); 
    displayName.setText(nameOfTheSong); 
    //title.setText(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.TITLE))); 
    long durationInMS = Long.parseLong(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.AudioColumns.DURATION))); 
    double durationInMin = ((double)durationInMS/1000.0)/60.0; 
    BigDecimal bigDecimal = new BigDecimal(durationInMin); 
    durationInMin = bigDecimal.setScale(2, RoundingMode.HALF_UP).doubleValue(); 
    duration.setText(""+durationInMin); 
    //SETTING THE PATH WHICH IS THEN USED IN onListItemClick OF THE MAINACTIVITY.JAVA CLASS 
    view.setTag(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA))); 
} 

MainActivity.java

package com.example.android.playmusic; 

import android.Manifest; 
import android.annotation.TargetApi; 
import android.app.ListActivity; 
import android.content.pm.PackageManager; 
import android.database.Cursor; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Handler; 
import android.provider.MediaStore; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.ImageButton; 
import android.widget.ListView; 
import android.widget.ScrollView; 
import android.widget.SeekBar; 
import android.widget.TextView; 

import java.io.IOException; 


public class MainActivity extends ListActivity { 

private static final int UPDATE_FREQUENCY = 500; 
private static final int STEP_VALUE = 4000; 
private TextView selectedFile = null; 
private SeekBar seekBar = null; 
private MediaPlayer mediaPlayer = null; 
private ImageButton play = null; 
private ImageButton next = null; 
private ImageButton prev = null; 
private ImageButton playFromCurrentPosition = null; 
private MediaCursorAdapter adapter = null; 
private boolean isStarted = true; 
private String currentFile = ""; 
private boolean isMovingSeekBar = false; 
private final Handler handler = new Handler(); 
private GestureDetector mGestureDetector; 
private boolean mLongClicked; 

private final Runnable updatePositionRunnable = new Runnable(){ 
    @Override 
    public void run() { 
     updatePosition(); 
    } 
}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    if((ContextCompat.checkSelfPermission(this,Manifest.permission.READ_EXTERNAL_STORAGE))!=PackageManager.PERMISSION_GRANTED){ 
     ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},99); 
    } 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    selectedFile = (TextView) findViewById(R.id.selectedItem); 
    seekBar = (SeekBar) findViewById(R.id.seekBar); 
    prev = (ImageButton) findViewById(R.id.previous); 
    play = (ImageButton) findViewById(R.id.play); 
    next = (ImageButton) findViewById(R.id.next); 
    playFromCurrentPosition = (ImageButton) findViewById(R.id.play_from_current_position); 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setOnCompletionListener(onCompletion); 
    mediaPlayer.setOnErrorListener(onError); 
    seekBar.setOnSeekBarChangeListener(seekBarChanged); 
    Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,null,null,null,null); 
    if(null!=cursor){ 
     cursor.moveToFirst(); 
     adapter = new MediaCursorAdapter(this,R.layout.item,cursor); 
     setListAdapter(adapter); 
     prev.setOnClickListener(onButtonClick); 
     play.setOnClickListener(onButtonClick); 
     next.setOnClickListener(onButtonClick); 
     playFromCurrentPosition.setOnClickListener(onButtonClick); 
    } 

} 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 
    currentFile = (String) v.getTag(); 
    startPlay(currentFile); 
} 

private void startPlay(String file){ 
    String name = new StringBuilder(file).reverse().toString(); 
    name = name.split("/")[0]; 
    name = new StringBuilder(name).reverse().toString(); 
    name = name.substring(0,name.length()-4); 
    selectedFile.setText(name); 
    seekBar.setProgress(0); 
    mediaPlayer.stop(); 
    mediaPlayer.reset(); 

    try{ 
     mediaPlayer.setDataSource(currentFile); 
     mediaPlayer.prepare(); 
     mediaPlayer.start(); 
    } 
    catch (IllegalArgumentException e){ 
     e.printStackTrace(); 
    } 
    catch(IOException e){ 
     e.printStackTrace(); 
    } 
    catch (IllegalStateException e){ 
     e.printStackTrace(); 
    } 
    seekBar.setMax(mediaPlayer.getDuration()); 
    play.setVisibility(View.INVISIBLE); 
    playFromCurrentPosition.setVisibility(View.VISIBLE); 
    playFromCurrentPosition.setImageResource(android.R.drawable.ic_media_pause); 
    updatePosition(); 
    isStarted = true; 
} 

private void stopPlay(){ 
    mediaPlayer.stop(); 
    mediaPlayer.reset(); 
    play.setImageResource(android.R.drawable.ic_media_play); 
    handler.removeCallbacks(updatePositionRunnable); 
    seekBar.setProgress(0); 
    isStarted = false; 
} 

private void updatePosition(){ 
    handler.removeCallbacks(updatePositionRunnable); 
    seekBar.setProgress(mediaPlayer.getCurrentPosition()); 
    handler.postDelayed(updatePositionRunnable,UPDATE_FREQUENCY); 
} 

private View.OnClickListener onButtonClick = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     switch (v.getId()){ 
      case R.id.play_from_current_position:{ 
       if(mediaPlayer.isPlaying()){ 
        handler.removeCallbacks(updatePositionRunnable); 
        mediaPlayer.pause(); 
        playFromCurrentPosition.setImageResource(android.R.drawable.ic_media_play); 
        updatePosition(); 
       } 
       else{ 
        int length = mediaPlayer.getCurrentPosition(); 
        playFromCurrentPosition.setImageResource(android.R.drawable.ic_media_pause); 
        mediaPlayer.seekTo(length); 
        mediaPlayer.start(); 
       } 
       break; 
      } 


      case R.id.next:{ 

       //Need to play the next Song here 
       int seekTo = mediaPlayer.getCurrentPosition()+STEP_VALUE; 
       if(seekTo>mediaPlayer.getDuration()) { 
        seekTo = mediaPlayer.getDuration(); 
       } 
       if(mediaPlayer.isPlaying()){ 
        mediaPlayer.seekTo(seekTo); 
       } 
       else{ 
        mediaPlayer.pause(); 
        mediaPlayer.seekTo(seekTo); 

       } 

       //mediaPlayer.start(); 
       break; 
      } 

      case R.id.previous:{ 
       int seekTo = mediaPlayer.getCurrentPosition()-STEP_VALUE; 
       if(seekTo<0){ 
        seekTo = 0; 
       } 
       if(mediaPlayer.isPlaying()){ 
        mediaPlayer.seekTo(seekTo); 
       } 
       else{ 
        mediaPlayer.pause(); 
        mediaPlayer.seekTo(seekTo); 

       } 
       //mediaPlayer.start(); 
       break; 
      } 

     } 
    } 
}; 


private MediaPlayer.OnErrorListener onError = new MediaPlayer.OnErrorListener() { 
    @Override 
    public boolean onError(MediaPlayer mp, int what, int extra) { 
     return false; 
    } 
}; 

private SeekBar.OnSeekBarChangeListener seekBarChanged = new SeekBar.OnSeekBarChangeListener() { 
    @Override 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     if(isMovingSeekBar){ 
      mediaPlayer.seekTo(progress); 
     } 
    } 

    @Override 
    public void onStartTrackingTouch(SeekBar seekBar) { 
     isMovingSeekBar = true; 
    } 

    @Override 
    public void onStopTrackingTouch(SeekBar seekBar) { 
     isMovingSeekBar = false; 
    } 
}; 

private MediaPlayer.OnCompletionListener onCompletion = new MediaPlayer.OnCompletionListener() { 
    @Override 
    public void onCompletion(MediaPlayer mp) { 
     stopPlay(); 
    } 
}; 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    handler.removeCallbacks(updatePositionRunnable); 
    mediaPlayer.stop(); 
    mediaPlayer.reset(); 
    mediaPlayer.release(); 
    mediaPlayer = null; 
} 


} 

Répondre

0

Vous pouvez le faire en utilisant une fonction dans votre classe d'activité à laquelle vous passez votre cursor et cette fonction renvoie une «Liste» que vous pouvez passer à votre adaptateur. Voici l'exemple de code.

public List<AudioTrack> returnMappedList(Cursor cursor) 
{ 
    List<AudioTrack> trackList = new ArrayList<>(); 
    if (cursor.moveToFirst()) 
    { 
     AudioTrack newAudioTrack; 
     do 
     { 
      long trackID = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media._ID)); 
      String trackTitle = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); 
      String trackArtist = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); 
      String albumName = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); 
      long trackDuration = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION)); 
      long trackAlbumID = cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); 

      newAudioTrack = new AudioTrack(); 

      newAudioTrack.setTrackID(trackID); 
      newAudioTrack.setTrackTitle(trackTitle); 
      newAudioTrack.setArtistName(trackArtist); 
      newAudioTrack.setAlbumName(albumName); 
      newAudioTrack.setTrackDuration(trackDuration); 
      newAudioTrack.setContainingAlbumID(trackAlbumID); 
      newAudioTrack.setTrackType(AudioTrack.TRACK_TYPE_AUDIO); 

      trackList.add(newAudioTrack); 
     } 
     while (cursor.moveToNext()); 
    } 
    return trackList; 
} 

Maintenant, conservez l'index de la chanson en cours de lecture dans un nombre entier. Et quand vous voulez jouer la chanson suivante. Passez juste la mise à jour de l'index et passez la nouvelle chanson de la liste que vous avez.