I made a simple mediaplayer android app, but I've a bug:
uri = Uri.parse(/data/hw_init/hw_product/media/Pre-loaded/Music/Beijing_Bass.mp3);
MediaPlayer.create(getApplicationContext(), uri).start();
works fine
but
uri = Uri.parse(/storage/emulated/0/Download/Beijing_Bass.mp3);
MediaPlayer.create(getApplicationContext(), uri).start();
doesn't work ! (Null Pointer Exception)
On my MainActivity this is how I request permission :
//ask for permission for read and write external storage
private void permission(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
} else {
Toast.makeText(this, "Permission granted", Toast.LENGTH_SHORT).show();
musicFiles = getAllAudioFromDevice(this);
}
}
}
// on permission granted find all music files and add them to the list
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
permission();
} else {
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
}
}
in my manifest:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
can you help me to understand my mistake ?
Thanks a lot
edit : this is how I got my uri :
public static ArrayList<MusicFiles> getAllAudioFromDevice(final MainActivity mainActivity) {
ArrayList<MusicFiles> tempAudioList = new ArrayList<>();
Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String[] projection = {
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.DATA, // for path
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media._ID
};
Cursor cursor = mainActivity.getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String album = cursor.getString(0);
String artist = cursor.getString(1);
String duration = cursor.getString(2);
String path = cursor.getString(3);
String displayName = cursor.getString(4);
String title = cursor.getString(5);
String id = cursor.getString(6);
MusicFiles musicFilesTemp = new MusicFiles(path, title, artist, album, duration, displayName, id);
Log.e("Music","Path : " + path +" Album : " + album );
tempAudioList.add(musicFilesTemp);
}
cursor.close();
}
Log.e("Music","search complete");
return tempAudioList;
}
and then this is how I really start my mediaplayer :
private void getIntentMethod() {
position = getIntent().getIntExtra("position", -1);
listSongs = musicFiles;
if (listSongs != null) {
playPauseBtn.setImageResource(R.drawable.ic_pause);
uri = Uri.parse(listSongs.get(position).getPath());
}
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
Log.e("Music","Media Player released");
}
mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
Log.e("Music",uri.toString());
if (mediaPlayer != null) {
mediaPlayer.start();
seekBar.setMax(mediaPlayer.getDuration() / 1000);
duration_total.setText(formattedTime(mediaPlayer.getDuration() / 1000));
song_name.setText(listSongs.get(position).getTitle());
artist_name.setText(listSongs.get(position).getArtist());
metaData(uri);
} else {
Log.e("Media Player", "Media Player is null");
}
Thanks to the logcat, I detected that my probleme of NPE occures only when my uri start with "/storage/..." and it works fine when it starts with "/data/..."