Android Исключение нулевой точки медиаплеера (Java) - PullRequest
1 голос
/ 07 апреля 2020

Я пытаюсь создать сеанс Mediaplayer с указанным URI. но это вызывает NullpointerException .

    Uri uri = Uri.parse(path);

    // Creating MediaPlayer with given song's URI
    if (mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.release();
    }
    mediaPlayer = MediaPlayer.create(this, uri);

    try {
        // Setting the MediaPlayer Listener
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                seekBar.setMax(mp.getDuration());
                mediaPlayer.start();
                changeSeekbar();
            }
        });
    } catch (Exception e) {
        Log.e("ERROR", e.toString());
    }

Учитывая Logcat:

2020-04-07 22:21:05.289 12237-12237/com.example.musicappresearch2 E/Path: /storage/emulated/0/Music/Alone - Viren.mp3
2020-04-07 22:21:05.289 12237-12237/com.example.musicappresearch2 E/ERROR: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.setOnPreparedListener(android.media.MediaPlayer$OnPreparedListener)' on a null object reference

Не могли бы вы сказать мне, что я делаю неправильно? Спасибо.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Есть два способа написания этого кода, оба протестированы на устройстве

Прежде всего, убедитесь, что вы правильно обрабатываете android.permission.READ_EXTERNAL_STORAGE и у вас действительно правильный Uri.
MediaPlayer.create(this, uri); потерпит неудачу, если контекст или uri будут недействительными.

MediaPlayer.create(this, uri);, который сам уже готовит игрока, так что не нужно .prepareAsync() в этой ситуации. и ваш код хорош для go.

по-другому:


    mediaPlayer = new MediaPlayer(); // hence, we don't use .create, manually instantiate
    try {
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.setDataSource(this, uri);
        mediaPlayer.setOnPreparedListener(mp -> {
            mediaPlayer.start();
        });

        /* use async, if you don't want to block UI thread
         keep in mind, this should be called after setting listener  
       because it might prepare even until the listener has been set */
        mediaPlayer.prepareAsync(); 
    } catch (Exception e) {
        Log.e("ERROR", e.toString());
    }

0 голосов
/ 07 апреля 2020

Попробуйте это:

            Uri uri = Uri.parse(path);

        mediaPlayer = new MediaPlayer();
        try {
           // mediaPlayer.setDataSource(String.valueOf(uri));
           mediaPlayer.setDataSource(MainActivity.this,uri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            mediaPlayer.prepare();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mediaPlayer.start();
...