Sunday, January 13, 2019

Nghe nhạc từ thẻ nhớ


Ta muốn phát nhạc từ các file mp3 lưu trong thẻ nhớ điện thoại.
Khai báo mảng, biến cần dùng.
MediaPlayer mPlayer;
ArrayList<String> mMusicList=new ArrayList<String>();
ArrayList<String> mAudioPath=new ArrayList<String>();
Copy các hàm cần dùng vào trên ngoặc đóng cuối cùng.
private void playSong(String path) throws IllegalArgumentException,
         IllegalStateException, IOException {
         mPlayer.reset();
         mPlayer.setDataSource(path);      
         //mPlayer.setLooping(true);
         mPlayer.prepare();
         mPlayer.start();
   }   
private ArrayList<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();
ArrayList<String> songs=new ArrayList<String>();
          int i = 0;
     if (mCursor.moveToFirst()) {
             do {               mAudioPath.add(mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)));
songs.add(mCursor.getString(mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME)));                      
           i++;
            } while (mCursor.moveToNext());
     }  
mCursor.close();
return songs;
}        
Tạo một file xml trong folder layout, trong đó có một listview.
<ListView
     android:id="@+id/li"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:layout_above="@+id/t"
     android:layout_gravity="center"
     android:layout_marginTop="3dp" >
 </ListView>
Khai báo quyền đọc thẻ nhớ vào file manifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Trong class sẽ chơi nhạc, khởi tạo dưới setcontentView();
mPlayer = new MediaPlayer();
ListView mListView = (ListView) findViewById(R.id.li);
mMusicList = getAudioList();
for(int i=0;i<mMusicList.size();i++){
     for(int j=1;j<mMusicList.size();j++){
     if(mMusicList.get(j).equals(mMusicList.get(i))) {
          mMusicList.remove(j);
          mAudioPath.remove(j);
          }
     }
}
Vòng lặp for ở đây để loại bỏ các file nhạc trùng nếu có trong thẻ nhớ và lưu trữ điện thoại.
Khởi tạo listView xuống tiếp.
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.get(arg2));
     } catch (IllegalArgumentException e) {
     e.printStackTrace();
     } catch (IllegalStateException e) {
     e.printStackTrace();
     } catch (IOException e) {
     e.printStackTrace();
     }
     }
});
Vậy là xong, chạy thử,  ấn vào các dòng của listView, nhạc sẽ phát, ấn dòng khác, nhạc sẽ phát bài khác.
Tên bài hát lấy ra sẽ có cả tên ca sỹ đi kèm, có thể xử lý chặt chuỗi để chỉ hiển thị tên bài hát.
Nhớ thêm đoạn sau để huỷ khi thoát class.
@Override
     public void onDestroy() {
          super.onDestroy();
          if (mPlayer != null) {
               mPlayer.release();
          }
           

}

No comments:

Post a Comment