You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android音乐播放器报错:调用MediaPlayer.start()时出现空对象引用

排查MediaPlayer空指针错误的解决方案

嘿,我来帮你搞定这个头疼的空指针问题!你遇到的Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference错误,虽然已经确认uri和PlayingScreen_List不为空,但问题的核心其实在MediaPlayer.create()方法上——这个方法并不是总能成功返回MediaPlayer实例,哪怕你传入的URI看起来没问题。

为什么会出现这个问题?

MediaPlayer.create()会在以下几种情况下返回null:

  • 音频格式不被Android系统支持(比如某些小众编码的无损文件、损坏的音频文件)
  • 缺少访问音频文件的权限(尤其是Android 6.0+的动态权限)
  • URI路径格式有误(比如没有正确以file://开头,或者路径包含特殊字符)

修复后的代码示例

我帮你调整了playSongs()方法,增加了关键的空值校验和错误处理,能有效避免这个问题:

public void playSongs() {
    // 先校验列表和位置的有效性
    if(PlayingScreen_List == null || position < 0 || position >= PlayingScreen_List.size()) {
        Toast.makeText(getApplicationContext(), "无效的歌曲列表或播放位置", Toast.LENGTH_SHORT).show();
        return;
    }

    uri = Uri.parse(PlayingScreen_List.get(position).getPath());
    if (uri == null) {
        Toast.makeText(getApplicationContext(), "无法解析歌曲路径", Toast.LENGTH_SHORT).show();
        return;
    }

    // 安全释放旧的MediaPlayer资源
    if (mediaPlayer != null) {
        if (mediaPlayer.isPlaying()) {
            mediaPlayer.stop();
        }
        mediaPlayer.release();
        mediaPlayer = null; // 必须置为null,避免引用已释放的对象
    }

    // 创建新的MediaPlayer实例
    mediaPlayer = MediaPlayer.create(getApplicationContext(), uri);
    
    // 关键:创建后立即检查是否为null
    if (mediaPlayer == null) {
        Toast.makeText(getApplicationContext(), "无法加载该歌曲,可能格式不支持或权限不足", Toast.LENGTH_SHORT).show();
        return;
    }

    // 添加准备完成监听,确保MediaPlayer就绪后再启动(比直接start更稳妥)
    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mp.start();
        }
    });

    // 添加错误监听,方便排查具体问题
    mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) {
            Log.e("PlayingScreen", "MediaPlayer错误码: what=" + what + ", extra=" + extra);
            Toast.makeText(getApplicationContext(), "播放失败,请检查音频文件", Toast.LENGTH_SHORT).show();
            return true;
        }
    });
}

额外的排查步骤

  • 检查权限配置:
    在AndroidManifest.xml中添加存储权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

    如果目标SDK是23及以上,需要在Activity中动态申请权限:

    // 在onCreate或合适的时机调用
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1001);
    }
    
  • 验证音频文件有效性:
    找一个确定能正常播放的MP3文件替换测试,排除文件本身损坏或格式不兼容的问题。

  • 确认URI格式:
    用Log打印完整URI路径(比Toast更清晰):

    Log.d("PlayingScreen", "当前播放URI: " + uri.toString());
    

    确保路径是正确的file://格式,比如file:///storage/emulated/0/Music/test.mp3。

内容的提问来源于stack exchange,提问作者Elsa__fewfwef

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:57:56