有没有办法抑制Android设备上的低电量警告或关闭警报弹出窗口?

时间:2011-06-10 10:49:16

标签: android

我们正在开发一款Android应用程序,该应用程序将在装有大电池的设备上运行,以便在两次充电之间提供更长的运行时间。

问题是操作系统无法正确读取电池的电量并在剩余电量时显示电量不足的警报。

我们在单次电池充电时长时间使用设备,并且大约每4小时就会显示一次低电量警报。

有没有办法阻止此警报出现而无需根设备?是否可以截取电池状态的广播并阻止系统响应?或者我们可以做些什么来在电池警告显示后立即将其取消?

到目前为止,我们的研究结果都没有发现,因为我们怀疑出于安全原因这是不可能的。希望你们中的一位Android专家可以证实/否认我们的怀疑。

1 个答案:

答案 0 :(得分:8)

让我们深入了解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,这也很有挑战性,因为你需要修改资源或代码(然后重新签名)。