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

