【问题标题】:Android Mediaplayer Null point Exception (Java)Android Mediaplayer 空点异常 (Java)
【发布时间】:2020-04-08 19:24:21
【问题描述】:

我正在尝试使用给定的 uri 创建 Mediaplayer 会话。但它会导致 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

你能告诉我我做错了什么吗?谢谢。

【问题讨论】:

  • 根据共享的日志,您的 mediaPlayer 对象未实例化并且它为空,因此应用程序在尝试对其调用 setOnPreparedListener 方法时给出 NPE。您可以在调用方法之前为 mediaPlayer 添加空检查并尝试。
  • 这些都没有帮助。实际上这适用于 API 23,但现在在 Android 10 中它提供了 NPE
  • 你是如何获得 Uri 的?通过意图?

标签: java android android-mediaplayer


【解决方案1】:

这段代码有两种写法,都在设备上测试过

首先,确保您正确处理 android.permission.READ_EXTERNAL_STORAGE 并且您确实拥有正确的 Uri。
如果上下文或 uri 无效,MediaPlayer.create(this, uri); 将失败。

MediaPlayer.create(this, uri); 本身已经准备好播放器,因此在这种情况下您不需要 .prepareAsync()。你的代码很好用。

另一种方式:


    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());
    }

【讨论】:

    【解决方案2】:

    试试这个:

                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();
    

    【讨论】:

    • 这个解决方案在 mediaplayer.prepare() 上给出了 IllegalStateException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多