繁体   English   中英

是否存在一个系统变量来保存Android特定于设备的低电量阈值?

[英]Is there a system variable that holds the device-specific low-battery threshold for Android?

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

当电池在任一方向上越过低电量阈值时,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);
        }
    }
};

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

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

    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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM