Android BatteryManager为所有属性检索调用返回0

Android BatteryManager为所有属性检索调用返回0,android,batterymanager,Android,Batterymanager,我在尝试从Android设备的电池访问大多数统计数据时遇到了问题,例如电池属性属性属性容量,电池属性属性充电计数器或电池属性属性当前平均值。这些属性都清楚地记录在这里: 我在舱单上声明了以下权限: <uses-permission android:name="android.permission.BATTERY_STATS" /> 每当我试图检索这些统计数据时: double remainingCapacity = mBatteryManager.getIntProperty(

我在尝试从Android设备的电池访问大多数统计数据时遇到了问题,例如
电池属性属性属性容量
电池属性属性充电计数器
电池属性属性当前平均值
。这些属性都清楚地记录在这里:

我在舱单上声明了以下权限:

<uses-permission android:name="android.permission.BATTERY_STATS" />
每当我试图检索这些统计数据时:

double remainingCapacity = mBatteryManager.getIntProperty(
            BatteryManager.BATTERY_PROPERTY_CAPACITY);
double batteryCapacityMicroAh = mBatteryManager.getIntProperty(
            BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER);
double averageCurrentMicroA = mBatteryManager.getIntProperty(
            BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE);
所有这些的结果都是0。总是,毫无疑问,0。我已经在一个模拟器,一个实际的设备上试过了,我想到的一切都没能改变我的结果


我非常感谢您的帮助。最终,我要做的是计算设备达到完全充电(充电时)的剩余时间。提前感谢。

您需要注册操作\u电池\u更换广播。无论何时发生此事件,都将调用此函数。由于这是一个棘手的意图,它会在注册后继续广播。下面的方法将获得电池的当前电量

private void getBatteryPercentage() {
    BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            context.unregisterReceiver(this);
            int currentLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
            int level = -1;
            if (currentLevel >= 0 && scale > 0) {
                level = (currentLevel * 100) / scale;
            }
            Toast.makeText(MainActivity.this, level + "%", Toast.LENGTH_LONG).show();
        }
    };
    IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    registerReceiver(batteryLevelReceiver, batteryLevelFilter);
}

现在不确定这是否对您有帮助,但只有带有电池电量表()的手机才能报告您正在查找的某些值。好的,只有Nexus 6、9和10给出了您要查找的所有三个值,而Nexus 5只给出了电池管理器的
电池属性容量

值。额外级别是当前电池容量。
我想你是在寻找总容量(满),你需要阅读/sys/class/power\u supply/battery/charge\u full\u design或charge\u full,不同的制造商可能有不同的路径。

我相信你必须使用动作\u battery\u改变意图,看看。你根本不需要该权限,因为你无论如何都不能持有它(它是
signature
system
)。请尝试
getLongProperty()
,看看是否能获得更好的结果。@jackwilsdon:intent没有提供我需要的任何属性(我需要通过getIntProperty方法查询的属性),不是额外规模或额外级别。请重新阅读问题。看起来,这些属性都不是我需要的属性。请重新阅读问题。我需要的属性是电池属性容量和其他属性,这些属性不是通过行动电池更改意图提供的。
private void getBatteryPercentage() {
    BroadcastReceiver batteryLevelReceiver = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            context.unregisterReceiver(this);
            int currentLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
            int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
            int level = -1;
            if (currentLevel >= 0 && scale > 0) {
                level = (currentLevel * 100) / scale;
            }
            Toast.makeText(MainActivity.this, level + "%", Toast.LENGTH_LONG).show();
        }
    };
    IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
    registerReceiver(batteryLevelReceiver, batteryLevelFilter);
}