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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 06:45:30