Android想要獲取不同手機內存卡中的內容,要使用內容提供器。
下面介紹我所做的一個可以播放音樂,並且可以導入手機中所有音頻的demo。
首先講一下思路:
活動中開啓線程,實例化內容提供器對象ContentResolver,實例化cusor對象,掃描sdcard,踢除相應的圖片文件信息,獲取音頻的路徑,音頻的名稱等信息,儲存到早已封裝好的音樂對象類:MusicFile當中,並存入容器當中以便備用,當整個掃描完成後,將信息告訴handler,讓其處理UI線程中的變化。
這裏使用了一個封裝音樂信息的MusicFile類,和一個可以篩選圖片文件的util類,最後一個實現主要功能的Activity,
public class MainActivity extends AppCompatActivity {
private final static int MUSIC_SCARCH_FINISH = 1;//音樂掃描完成
private List<MusicFile> musicFiles=new ArrayList<MusicFile>();
private Button play;
private Button pause;
private Button reset,OK;
private TextView music;
private EditText id;
public static MediaPlayer player=new MediaPlayer();
ContentResolver contentResolver;
public static int ID;
private Handler mHandler=new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case MUSIC_SCARCH_FINISH://音樂掃描完成
//這裏進行UI操作
for(int i=0;i<musicFiles.size();i++){
music.append(musicFiles.get(i).getID()+" "+musicFiles.get(i).getName()+"\n");
}
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar actionBar=getSupportActionBar();
actionBar.setTitle("MyPlayer");
play=(Button)findViewById(R.id.play);
pause=(Button)findViewById(R.id.pause);
reset=(Button)findViewById(R.id.reset);
OK=(Button)findViewById(R.id.OK);
music=(TextView)findViewById(R.id.music);
id=(EditText)findViewById(R.id.id);
getMusicFloder();
OK.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ID=(int)Integer.parseInt(id.getText().toString());
player.reset();
try {
player.setDataSource(musicFiles.get(ID).getDir());
player.prepare();
} catch (IOException e) {
e.printStackTrace();
}
player.start();
}
});
contentResolver=getContentResolver();
int i=0;
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(!player.isPlaying()){
player.start();
}
}
});
pause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(player.isPlaying())player.pause();
}
});
reset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
player.reset();
try {
player.setDataSource(musicFiles.get(ID).getDir());
player.prepare();
} catch (IOException e) {
e.printStackTrace();
}
;//這裏一定要先進行reset再進行重置
}
});
}
private void getMusicFloder() {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
Toast.makeText(this, "沒有sdcard", Toast.LENGTH_LONG).show();
return;
}
new Thread(new Runnable() {
@Override
public void run() {
//查詢音樂
Uri mImageUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
ContentResolver mContentResolver = MainActivity.this.getContentResolver();
String selection= MediaStore.Audio.Media.MIME_TYPE + "=? ";
String[] selectionArgs=new String[]{"audio/mpeg"};
Cursor mCursor = mContentResolver.query(mImageUri,null,selection,selectionArgs, MediaStore.Audio.Media.DATE_MODIFIED);
int i=0;
while (mCursor.moveToNext()) {
String path = mCursor.getString(mCursor.getColumnIndex(MediaStore.Audio.Media.DATA));
int duration= mCursor.getInt(mCursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
MusicFile musicFile=new MusicFile();
musicFile.setDir(path);
musicFile.setId(i);
i++;
musicFile.setMusicDuration(duration);
musicFiles.add(musicFile);
}
mCursor.close();
// 通知Handler掃描圖片完成
mHandler.sendEmptyMessage(MUSIC_SCARCH_FINISH);
}
}).start();
}
}
public class MusicFile{
private int id;
private String dir;//音樂絕對路徑
private String name;//音樂名稱
private int musicDuration;//音樂時長
public String getDir() {
return dir;
}
public void setDir(String dir) {
this.dir = dir;
int lastIndexOf = this.dir.lastIndexOf("/");
this.name = this.dir.substring(lastIndexOf);
}
public String getName() {
return name;
}
public int getMusicDuration() {
return musicDuration;
}
public class Utils {
public static boolean isImage(String fileName){
if (fileName.endsWith(".jpg")|| fileName.endsWith(".JPG")|| fileName.endsWith(".png")|| fileName.endsWith(".PNG")
|| fileName.endsWith(".jpeg")|| fileName.endsWith(".JPEG")|| fileName.endsWith(".gif")|| fileName.endsWith(".GIF"))
return true;
return false;
}
public static String getStringByResId(Context context, int resId){
return context.getString(resId);
}
public static String getMusicDuration(int duration){
SimpleDateFormat sdf=new SimpleDateFormat("mm:ss");
return sdf.format(duration);
}
}
public void setMusicDuration(int musicDuration) { this.musicDuration = musicDuration; } public void setId(int id){ this.id=id; } public int getID(){ return id; }} 如此已經實現了導入手機中的全部歌曲並使用MediaPlayer進行播放。