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

从Hook方法获取设备传感器状态:创建IntentFilter遇NullPointerException求解

解决读取电池状态时的NullPointerException问题

你的空指针问题大概率出在两个地方:要么是AndroidAppHelper.currentApplication()返回了null,要么是调用时机太早,导致无法获取到有效的电池状态广播。我给你几个实用的解决思路:

1. 优先使用BatteryManager系统服务(更可靠)

直接通过系统服务获取电池状态,不需要注册广播,能彻底避免广播返回null的情况,代码也更简洁:

Context context = AndroidAppHelper.currentApplication();
if (context != null) {
    // 获取BatteryManager系统服务
    BatteryManager batteryManager = (BatteryManager) context.getSystemService(Context.BATTERY_SERVICE);
    // 获取电池剩余电量(百分比)
    int level = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
    // 获取当前充电状态
    int status = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_STATUS);
    boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
    
    // 在这里编写你的后续业务逻辑
} else {
    // 处理Context为空的情况,比如延迟执行或者记录错误日志
}

2. 确保Context有效且调用时机正确(如果坚持用广播方式)

如果你还是想用广播的方式读取电池状态,需要注意两个关键点:

  • 不要在模块初始化的早期(比如handleLoadPackage刚执行时)调用,这时候目标应用的Application可能还没创建完成,AndroidAppHelper.currentApplication()会返回null。
  • 可以Hook目标应用的Application.onCreate()方法,在应用完全启动后再执行读取逻辑:
XposedHelpers.findAndHookMethod(Application.class, "onCreate", new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
        super.afterHookedMethod(param);
        // 这里的Context是已初始化完成的Application实例,绝对有效
        Context context = (Application) param.thisObject;
        IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        Intent batteryStatus = context.registerReceiver(null, ifilter);
        
        if (batteryStatus != null) {
            int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
            boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING || status == BatteryManager.BATTERY_STATUS_FULL;
            
            // 处理你的业务逻辑
        }
    }
});

额外提醒

  • 一定要给Context和batteryStatus加上空判断,这是避免空指针的基础操作。
  • 读取电池状态不需要申请任何额外权限,所以不用在Manifest文件里添加权限声明。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:10:14