是否有系统变量保存Android的设备特定的低电池阈值?

时间:2013-04-23 18:07:13

标签: java android android-intent default batterylevel

我正在检查电池是否达到临界水平。

当电池超过任一方向的电池电量不足阈值时,Android会向您的应用发送意图。但这仅在您的应用程序运行时超过阈值时才有效(意图不是粘性的,因此它不会挂起)。因此,如果用户打开应用程序时它很低,那么您运气不佳(或至少是信息)。

还有一个粘性意图ACTION_BATTERY_CHANGED,其中包含有关电池电量和计算百分比的比例的信息,这很好。但是,我一直无法找到包含电池电量不足阈值的系统变量(它显然因设备而异)。

进行搜索,我发现:When android fires ACTION_BATTERY_LOW,Android系统代码的源列表,它使用系统变量com.android.internal.R.integer.config_lowBatteryWarningLevel。但是,我自己无法访问此变量(我的猜测是它受到保护)。

我希望有一个合理的标准来比较我的电池百分比,所以我知道何时关闭电池密集型功能。就是这样。

这是我的代码:

private BroadcastReceiver powerListener = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
    int batteryLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
    int batteryScale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1);
        int batteryPercentLeft = (batteryLevel * 100) / batteryScale;

        if (batteryPercentLeft <= com.android.internal.R.integer.config_lowBatteryWarningLevel) {
            _thread.onBatteryStateReceived(DataModel.BatteryState.LOW);
        }
    }
};

我收到系统变量的编译错误。还有其他选择吗?看起来这应该是一件简单的事情。我只想匹配系统行为,没什么特别的。

1 个答案:

答案 0 :(得分:0)

请注意,这 是可能的,但是使用了反射,因此不应依赖:

    try {
        Class clazz = Class.forName("com.android.internal.R$integer");
        Field field = clazz.getDeclaredField("config_lowBatteryWarningLevel");
        field.setAccessible(true);
        int LowBatteryLevel = _context.getResources().getInteger(field.getInt(null));
        Log.d("LowBattery","warninglevel " + LowBatteryLevel);
    } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) {
        e.printStackTrace();
    }

来源:https://stackoverflow.com/a/49424298/608312