Android多选音频时MediaPlayer空指针异常问题求助
解决多选音频文件后MediaPlayer.create()返回null的问题
问题根源
多选模式下,你错误地将ClipData中返回的content://协议Uri转换为本地文件路径,再通过Uri.fromFile()生成新Uri。但content类型Uri的getPath()并非真实的本地文件路径,生成的新Uri无法被MediaPlayer识别,最终导致MediaPlayer.create()返回null。而单选模式直接使用了系统返回的原Uri,因此可以正常工作。
解决方案
直接保存系统返回的原Uri到播放队列中,播放时直接使用该Uri初始化MediaPlayer,跳过错误的路径转换步骤。
修改后的代码示例
// 调整queueTracks类型为存储Uri(若之前是String类型,可改为存储uri.toString()) private ArrayList<Uri> queueTracks; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == Constants.FILE_PICKER_CODE && resultCode == RESULT_OK) { ClipData clipData = data.getClipData(); if (clipData != null) { // 初始化队列 if (queueTracks == null) { queueTracks = new ArrayList<>(); } queueTracks.clear(); for (int i = 0; i < clipData.getItemCount(); i++) { Uri uri = clipData.getItemAt(i).getUri(); // 直接保存原Uri到队列 queueTracks.add(uri); Snackbar.make(parentLayout, uri.toString(), Snackbar.LENGTH_SHORT).show(); } try { // 直接使用原Uri初始化MediaPlayer mainMediaPlayer = MediaPlayer.create(this, queueTracks.get(0)); if (mainMediaPlayer == null) { Log.d("Media player", "null!!!"); return; } mainMediaPlayer.start(); queueMode = true; placeInQueue = 0; } catch (Exception e) { AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle("Error"); builder.setMessage(e.getMessage()); builder.show(); e.printStackTrace(); return; } } else { // 单选模式逻辑保持不变 Uri audioUri = data.getData(); mainMediaPlayer = MediaPlayer.create(this, audioUri); mainMediaPlayer.start(); queueMode = false; placeInQueue = 0; } // 增加非空判断,避免空指针 if (mainMediaPlayer != null) { mainTrackSeekbar.setMax(mainMediaPlayer.getDuration()); mainTrackSeekbar.setEnabled(true); } } }
额外注意事项
- 若你需要将Uri以字符串形式存储,可保存
uri.toString(),播放时通过Uri.parse(queueTracks.get(0))解析回Uri对象。 - Android 10及以上版本采用分区存储机制,禁止直接访问本地文件路径,使用content Uri是合规且推荐的做法。
- 若部分音频文件仍无法播放,可能是文件格式不被MediaPlayer支持,可考虑添加格式校验,或使用ExoPlayer替代(对更多音频格式兼容性更好)。
内容的提问来源于stack exchange,提问作者SE User
相关产品推荐
相关产品推荐

