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

Android调用mediaPlayer.start()出现Null Pointer Exception问题求助

MediaPlayer.create() 作用及故障排查

MediaPlayer.create() 核心作用

MediaPlayer.create() 是Android系统封装的MediaPlayer便捷初始化方法,会一次性完成**实例创建、数据源设置、预处理(prepare)**三个核心步骤,调用成功直接返回就绪状态的MediaPlayer实例,开发者无需手动调用setDataSource()、prepare()等方法。如果任意一步执行失败,该方法不会抛出异常,而是直接返回null,这就是你调用start()时触发空指针的根本原因。

代码核心错误

你代码中最致命的问题是Uri构造逻辑错误:
通过ACTION_VIEW匹配到的Intent返回的intent.getData()本身就是完整的Uri,大概率是content://开头的内容Uri(而非file://开头的本地文件Uri),你调用.getPath()仅提取了Uri的路径部分,丢失了协议标识等信息,生成的新Uri是无效的,MediaPlayer无法识别该数据源,自然会创建失败返回null。

其他常见失败原因(排除格式无效、文件不存在)

  • 权限缺失:如果音频文件来自外部存储、其他应用共享目录,未申请对应读取权限会导致读取失败:Android 12及以下需申请READ_EXTERNAL_STORAGE,Android 13及以上需申请READ_MEDIA_AUDIO
  • 数据源被独占:目标音频文件正在被其他应用占用、加密,MediaPlayer无法获取读取流
  • 无效上下文:调用MediaPlayer.create()时传入的Context已被销毁(你当前用的ApplicationContext该问题概率较低)
  • 静态实例异常:你给MediaPlayer加了static修饰,静态变量生命周期和应用进程一致,多次调用release()后可能出现状态异常,也容易引发内存泄漏,不建议使用静态修饰。

修正后的核心代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_intent_player);

    initViews();
    Intent intent = getIntent();
    if (Intent.ACTION_VIEW.equals(intent.getAction())){
        Log.d("Intent Player_Activity:", " File Uri: "+ intent.getData());

        playPauseBtn.setImageResource(R.drawable.ic_pause_circle_outline);
        // 直接使用完整Uri,不要提取getPath()构造新Uri
        uri = intent.getData();

        if (mediaPlayer != null){
            mediaPlayer.stop();
            mediaPlayer.release();
        }
        mediaPlayer = MediaPlayer.create(getApplicationContext(),uri);
        // 增加非空判断,避免空指针
        if (mediaPlayer != null) {
            mediaPlayer.start();
        } else {
            Log.e("IntentPlayer", "MediaPlayer创建失败,请检查权限和Uri有效性");
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:24:05