Andreas câu trả lời là đúng cách để làm điều này nhưng mã mà không nhận được đường dẫn tập tin tuyệt đối. Điều này làm cho mMediaPlayer.prepare();
ném IOException: Prepare failed. status=0x1
.
Đây là đoạn mã để có được những đường dẫn tập tin cùng với tên file:
private String[] mAudioPath;
private MediaPlayer mMediaPlayer;
private String[] mMusicList;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMediaPlayer = new MediaPlayer();
ListView mListView = (ListView) findViewById(R.id.listView1);
mMusicList = getAudioList();
ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mMusicList);
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
try {
playSong(mAudioPath[arg2]);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private String[] getAudioList() {
final Cursor mCursor = getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Audio.Media.DISPLAY_NAME, MediaStore.Audio.Media.DATA }, null, null,
"LOWER(" + MediaStore.Audio.Media.TITLE + ") ASC");
int count = mCursor.getCount();
String[] songs = new String[count];
String[] mAudioPath = new String[count];
int i = 0;
if (mCursor.moveToFirst()) {
do {
songs[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));
mAudioPath[i] = mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
i++;
} while (mCursor.moveToNext());
}
mCursor.close();
return songs;
}
Bây giờ chúng ta có đường dẫn tuyệt đối, chúng tôi không cần phải nhận được con đường một lần nữa. Vì vậy:
private void playSong(String path) throws IllegalArgumentException,
IllegalStateException, IOException {
Log.d("ringtone", "playSong :: " + path);
mMediaPlayer.reset();
mMediaPlayer.setDataSource(path);
//mMediaPlayer.setLooping(true);
mMediaPlayer.prepare();
mMediaPlayer.start();
}
Hãy chắc chắn để sử dụng:
playSong(mAudioPath[arg2]);
thay vì:
playSong(mMusicList[arg2]);
trong OnItemClickListener listview.
Để có được chỉ tiêu đề của ca khúc (Trông hơn tao nhã hơn so với tên tập tin với phần mở rộng toàn bộ) sử dụng:
`MediaStore.Audio.Media.TITLE`
thay vì:
`MediaStore.Audio.Media.DISPLAY_NAME`
Nó gây ra IOException: Chuẩn bị thất bại. status = 0x1 tại dòng mMediaPlayer.prepare(); –
Nhận IOException chuẩn bị trạng thái không thành công = 0x1 !!! –