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

