2

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

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

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

进行搜索,我发现:当 android 触发 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);
        }
    }
};

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

4

1 回答 1

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

于 2018-09-11T13:05:59.137 回答