android Mediaplayer NPE on files in storage but not in system files

Viewed 21

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/..."

1 Answers

debug using this code from https://developer.android.com/guide/topics/media/mediaplayer#java

long id = /* retrieve it from somewhere */;
Uri contentUri = ContentUris.withAppendedId(
        android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, id);

mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), contentUri);

// ...prepare and start...

many thanks to blackapps

Related