Select a music file to play with MediaPlayer
Solution 1
First start activity to pic media file from sd card. Replace the following code
Button openFile = (Button) this.findViewById(R.id.ButtonOpen);
openFile.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 10);
}
});
Then in add the following code in onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == RESULT_OK && requestCode == 10){
Uri uriSound=data.getData();
play(this, uriSound);
}
}
And call the below method to create media player and play selected audio file.
private void play(Context context, Uri uri) {
try {
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(context, uri);
mp.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Solution 2
If someone have difficulties with this question as I had, I did some fixes to the answers above, and this snippet should work:
private final int SELECT_MUSIC = 1;
public void pickMusic() {
Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i,SELECT_MUSIC);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == SELECT_MUSIC){
Uri selectedMusicUri = data.getData();
if (selectedMusicUri != null){
String pathFromUri = getRealPathFromURI(this, selectedMusicUri);
MediaPlayer mp = new MediaPlayer();
try {
mp.setDataSource(this, Uri.parse(pathFromUri));
mp.prepare();
mp.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
private String getRealPathFromURI(Context context, Uri contentUri) {
String[] projection = { MediaStore.Audio.Media.DATA };
CursorLoader loader = new CursorLoader(context, contentUri, projection, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
Liverpudlian
Updated on June 07, 2022Comments
-
Liverpudlian about 2 years
I'm new in android programming and now i get a problem with my app. I intend to code a MediaPlayer application with feature: select a file from storage using intent then start playing that file. I use "MediaPlayer.create(context, uri)" method but currently i got error
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //openFile(); Button openFile = (Button) this.findViewById(R.id.ButtonOpen); openFile.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent chooseFile; Intent intent; chooseFile = new Intent(Intent.ACTION_GET_CONTENT); chooseFile.setType("file/*"); intent = Intent.createChooser(chooseFile, "Choose a file"); startActivityForResult(intent, ACTIVITY_CHOOSE_FILE); Uri uri = intent.getData(); initViews(uri); } }); } private void initViews(Uri uri) { mButtonPlayStop = (Button) findViewById(R.id.ButtonPlayStop); mButtonPlayStop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { buttonClick(); } }); mMediaPlayer = MediaPlayer.create(this, uri); } private void starPlayProgressUpdater() { mSeekBar.setProgress(mMediaPlayer.getCurrentPosition()); if (mMediaPlayer.isPlaying()) { Runnable notification = new Runnable() { @Override public void run() { starPlayProgressUpdater(); } }; mHandler.postDelayed(notification, 1000); } else { mMediaPlayer.pause(); mButtonPlayStop.setText(getString(R.string.play_str)); mSeekBar.setProgress(0); } } private void buttonClick() { if (mButtonPlayStop.getText() == getString(R.string.play_str)) { mButtonPlayStop.setText(getString(R.string.pause_str)); try { mMediaPlayer.start(); starPlayProgressUpdater(); } catch (IllegalStateException e) { mMediaPlayer.pause(); } } else { mButtonPlayStop.setText(getString(R.string.play_str)); mMediaPlayer.pause(); } }
And it throws NullPointerException in "mMediaPlayer = MediaPlayer.create(this, uri);". It has problem with the uri. Could anyone guild me the way?
Thanks Ilango j, i revised my code then now i could select and play a music file. But my expecteation is select file then only play after click on Play/Pause button (with progress bar) but i got new NullPointerException with my buttonClick
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = (Context) getApplicationContext(); Button openFile = (Button) this.findViewById(R.id.ButtonOpen); openFile.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { initView(); } }); } private void initView() { mButtonPlayStop = (Button) findViewById(R.id.ButtonPlayStop); mButtonPlayStop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { buttonClick(); } }); Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 10); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RESULT_OK && requestCode == 10) { Uri uri = data.getData(); mMediaPlayer = MediaPlayer.create(mContext, uri); mSeekBar = (SeekBar) findViewById(R.id.SeekBar01); mSeekBar.setMax(mMediaPlayer.getDuration()); mSeekBar.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { seekChange(v); return false; } }); } } private void starPlayProgressUpdater() { mSeekBar.setProgress(mMediaPlayer.getCurrentPosition()); if (mMediaPlayer.isPlaying()) { Runnable notification = new Runnable() { @Override public void run() { starPlayProgressUpdater(); } }; mHandler.postDelayed(notification, 1000); } else { mMediaPlayer.pause(); mButtonPlayStop.setText(getString(R.string.play_str)); mSeekBar.setProgress(0); } } private void seekChange(View v) { if (mMediaPlayer.isPlaying()) { SeekBar sb = (SeekBar) v; mMediaPlayer.seekTo(sb.getProgress()); } } private void buttonClick() { if (mButtonPlayStop.getText().equals(getString(R.string.play_str))) { mButtonPlayStop.setText(getString(R.string.pause_str)); try { mMediaPlayer.start(); starPlayProgressUpdater(); } catch (IllegalStateException e) { mMediaPlayer.pause(); } } else { mButtonPlayStop.setText(getString(R.string.play_str)); mMediaPlayer.pause(); } }
Could you please give an advice?