我正在检查电池是否达到临界水平。
当电池超过任一方向的电池电量不足阈值时,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);
}
}
};
我收到系统变量的编译错误。还有其他选择吗?看起来这应该是一件简单的事情。我只想匹配系统行为,没什么特别的。
答案 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();
}