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