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

Android中abandonAudioFocus触发NullPointerException问题咨询

为什么第二段代码会触发NullPointerException?

咱们直接拆解两段代码的核心差异,就能找到问题根源了。

先看你的两段代码:

第一段(运行正常)

private void releaseMediaPlayer() {
    if (mMediaPlayer != null) {
        mMediaPlayer.release();
        mMediaPlayer = null;
        mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);
    }
}

第二段(触发空指针)

private void releaseMediaPlayer() {
    if (mMediaPlayer != null) {
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
    mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);
}

关键区别就在mAudioManager.abandonAudioFocus(...)的执行时机:

  • 第一段里,这个方法只有在mMediaPlayer不为null的时候才会被调用——这意味着此时mAudioManager大概率处于有效状态(毕竟之前能初始化并使用mMediaPlayer,说明音频管理器是正常可用的)。
  • 第二段里,这个方法不管mMediaPlayer是否为null,都会强制执行。当mMediaPlayer为null时,很可能mAudioManager已经被提前释放或者从未初始化过(比如你在其他逻辑里把它置为null了),这时候直接调用它的方法,自然就会抛出java.lang.NullPointerException。

简单说:第二段代码没有确保mAudioManager在调用方法时是一个非null的有效对象。

修复方案

你有两种安全的选择:

  1. 保留第一段的逻辑:只有当mMediaPlayer存在时才释放音频焦点(毕竟只有获取过媒体播放器,才可能请求过音频焦点,需要释放)。
  2. 给第二段的abandonAudioFocus调用加一个非空判断,确保调用安全:
private void releaseMediaPlayer() {
    if (mMediaPlayer != null) {
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
    // 先判断mAudioManager是否有效,再执行释放操作
    if (mAudioManager != null) {
        mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);
    }
}

内容的提问来源于stack exchange,提问作者Keng Shing Aw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:14:40