我们正在开发一款Android应用程序,该应用程序将在配备大电池的设备上运行,以便提供更长的充电间隔时间。
问题是操作系统无法正确读取电池的电量,并在电池电量不足时显示电池电量不足警报。
我们在一次电池充电中使用设备的时间较长,大约每4小时就会出现一次电池电量不足的警报。
有没有办法在不启动设备的情况下阻止此警报出现?是否可以截获电池状态的广播并阻止系统对其做出响应?或者,我们可以做些什么,在电池警告显示后立即解除它?
到目前为止,我们的研究没有发现任何结果,因为我们怀疑,出于安全原因,这是不可能的。希望你们中的一位Android专家能证实/否认我们的怀疑。
发布于 2011-06-10 19:30:22
让我们深入研究一下android的源代码:
BatteryService
当电池电量不足时,有一个BatteryService
负责检测,如果发生这种情况,它会发送相应的广播。检测电池电量是否不足的确切位置可以在here找到。
/* The ACTION_BATTERY_LOW broadcast is sent in these situations:
* - is just un-plugged (previously was plugged) and battery level is
* less than or equal to WARNING, or
* - is not plugged and battery level falls to WARNING boundary
* (becomes <= mLowBatteryWarningLevel).
*/
final boolean sendBatteryLow = !plugged
&& mBatteryStatus != BatteryManager.BATTERY_STATUS_UNKNOWN
&& mBatteryLevel <= mLowBatteryWarningLevel
&& (oldPlugged || mLastBatteryLevel > mLowBatteryWarningLevel);
...
if (sendBatteryLow) {
mSentLowBatteryBroadcast = true;
statusIntent.setAction(Intent.ACTION_BATTERY_LOW);
mContext.sendBroadcast(statusIntent);
}
如果不重新构建Android操作系统,您将无法修改此行为。您可能会更改mLowBatteryWarningLevel
的值,因为它取自com.android.internal.R.integer.config_lowBatteryWarningLevel
资源。但这需要root用户,并且会使该资源所在的包的签名无效。
StatusBarPolicy
所以我们现在知道当击球率变低时BatteryService
会发送广播。但从源代码中可以清楚地看出,它没有显示警告。因此,下一步是找出谁真正显示了“电池电量不足”的警告。负责此操作的类是StatusBarPolicy
。它没有记录在案。您可能会感兴趣的两段代码是onBatteryLow()
和showLowBatteryWarning()
函数。
但这两个函数在外部世界中没有合理的影响点。所以这里也不会有黑客帮到你。
因此,如果没有root,这看起来是不可能的。即使你有root用户,这也很有挑战性,因为你需要修改资源或代码(然后重新签名)。
https://stackoverflow.com/questions/6305286
复制相似问题