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
相关产品推荐
相关产品推荐

