1
任何人都可以幫助我解決這個問題。下面是我的代碼,它可以正常運行,但我想從sd卡的文件夾(如/sdcard/Music/song.mp3)播放音樂。Android:如何從SD卡播放音頻文件
public class MainActivity extends Activity implements View.OnClickListener,SeekBar.OnSeekBarChangeListener {
private MediaPlayer mediaPlayer;
public TextView songName, duration,tvTotalTime;
private double timeElapsed = 0, finalTime = 0;
private int forwardTime = 2000, backwardTime = 2000;
private Handler durationHandler = new Handler();
private SeekBar seekbar;
private ImageButton imgPlay,imgPause;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getid();
initializeViews();
setListner();
}
private void setListner() {
imgPlay.setOnClickListener(this);
imgPause.setOnClickListener(this);
seekbar.setOnSeekBarChangeListener(this);
}
private void getid() {
songName = (TextView) findViewById(R.id.songName);
tvTotalTime =(TextView)findViewById(R.id.tvTotalTime);
mediaPlayer = MediaPlayer.create(this, R.raw.dheere);
duration = (TextView) findViewById(R.id.duration);
seekbar = (SeekBar) findViewById(R.id.seekBar);
imgPlay =(ImageButton)findViewById(R.id.imgPlay);
imgPause =(ImageButton)findViewById(R.id.imgPause);
}
public void initializeViews(){
finalTime = mediaPlayer.getDuration();
songName.setText("Sample_Song.mp3");
seekbar.setMax((int) finalTime);
seekbar.setClickable(true);
}
//handler to change seekBarTime
private Runnable updateSeekBarTime = new Runnable() {
public void run() {
//get current position
timeElapsed = mediaPlayer.getCurrentPosition();
//set seekbar progress
seekbar.setProgress((int) timeElapsed);
tvTotalTime.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) finalTime), TimeUnit.MILLISECONDS.toSeconds((long) finalTime)));
//set time remaing
double timeRemaining = finalTime - timeElapsed;
duration.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining), TimeUnit.MILLISECONDS.toSeconds((long) timeRemaining) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining))));
//repeat yourself that again in 100 miliseconds
durationHandler.postDelayed(this, 100);
}
};
@Override
public void onClick(View v) {
try {
switch (v.getId())
{
case R.id.imgPlay:
mediaPlayer.start();
timeElapsed = mediaPlayer.getCurrentPosition();
seekbar.setProgress((int) timeElapsed);
durationHandler.postDelayed(updateSeekBarTime, 100);
break;
case R.id.imgPause:
mediaPlayer.pause();
break;
}
} catch (IllegalStateException e) {
e.printStackTrace();
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
mediaPlayer.seekTo(progress);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
}
嗨Krunal, 我加你的方法,我的代碼播放MP3文件,但它顯示像這樣在開關等情況下,上述方法的代碼錯誤: - 案例R.id.imgPlay: 錯誤如下所示: MediaPlayer.setLooping(boolean)'對一個空對象引用。 –
它沒有正常工作作爲字符串文件路徑... –
嗨sakib,我檢查它,並做一個演示,我沒有發現任何問題。 –