-1
我正在開發一個簡單的使用ListView的MusicPlayer應用程序。Next Button MusicPlayer Android
有兩個類:MainActivity和MediaCursorAdapter。
遊標使用MainActivity類中的getContentResolver()形成,並傳遞給發生數據綁定的適配器。
現在點擊下一個按鈕我想播放下一首歌曲。但無法找到一種方法來做到這一點。
**的評論顯示了我試圖把這個在://需要在這裏打球
下一首樂曲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;
}
}