2017-07-20 2 views
-1

Ich entwickle eine einfache MusicPlayer App mit ListView.Next Button MusicPlayer Android

Es gibt zwei Klassen: MainActivity und MediaCursorAdapter.

Der Cursor wird mit getContentResolver() in der MainActivity-Klasse gebildet und an den Adapter übergeben, wo die Datenbindung stattfindet.

Jetzt auf Klick auf den Next Button Ich möchte das nächste Lied spielen. Aber nicht in der Lage, einen Weg zu finden, dies zu tun.

** Der Kommentar zeigt, wo ich versuche, dies in setzen: // das nächste Lied hier

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


} 

Antwort

0
spielen müssen

Sie können dies mit einer Funktion innerhalb Ihrer Aktivitätsklasse tun, an die Sie Ihre cursor übergeben. Diese Funktion gibt eine 'Liste' zurück, die Sie an Ihren Adapter übergeben können. Hier ist der Beispielcode.

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

Jetzt behalten Sie den Index des aktuellen Liedes, das gespielt wird, gespeichert in einer Ganzzahl. Und wenn du das nächste Lied spielen willst. Übergeben Sie einfach den Index und übergeben Sie den neuen Song aus der Liste, die Sie haben.

Verwandte Themen