我正在尝试收集Android G1手机的用电量统计信息.我有兴趣知道电压和电流的值,然后能够收集本PDF中报告的统计数据.
我可以通过注册意向接收器来接收广播ACTION_BATTERY_CHANGED来获得电池电压值.但问题是Android不会通过这个SDK界面暴露当前的价值.
我试过的一种方法是通过sysfs接口,我可以使用以下命令查看adb shell中的电池电流值
$cat /sys/class/power_supply/battery/batt_current
449
Run Code Online (Sandbox Code Playgroud)
但这只有在手机通过USB接口连接时才有效.如果我断开手机,我会看到batt_current的值为'0'.我不确定为什么报告的当前值为零.它应该大于零,对吧?
获取电池电流值的任何建议/指示?如果我错了,请纠正我.
Kev*_*ker 13
您可以查看Current Widget的源代码.它具有硬编码路径到某些平台存储当前值的位置.
/*
* Copyright (c) 2010-2011 Ran Manor
*
* This file is part of CurrentWidget.
*
* CurrentWidget is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* CurrentWidget is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with CurrentWidget. If not, see <http://www.gnu.org/licenses/>.
*/
package com.manor.currentwidget.library;
import java.io.File;
import android.os.Build;
import android.util.Log;
public class CurrentReaderFactory {
static public Long getValue() {
File f = null;
// htc desire hd / desire z / inspire?
if (Build.MODEL.toLowerCase().contains("desire hd") ||
Build.MODEL.toLowerCase().contains("desire z") ||
Build.MODEL.toLowerCase().contains("inspire")) {
f = new File("/sys/class/power_supply/battery/batt_current");
if (f.exists()) {
return OneLineReader.getValue(f, false);
}
}
// nexus one cyangoenmod
f = new File("/sys/devices/platform/ds2784-battery/getcurrent");
if (f.exists()) {
return OneLineReader.getValue(f, true);
}
// sony ericsson xperia x1
f = new File("/sys/devices/platform/i2c-adapter/i2c-0/0-0036/power_supply/ds2746-battery/current_now");
if (f.exists()) {
return OneLineReader.getValue(f, false);
}
// xdandroid
/*if (Build.MODEL.equalsIgnoreCase("MSM")) {*/
f = new File("/sys/devices/platform/i2c-adapter/i2c-0/0-0036/power_supply/battery/current_now");
if (f.exists()) {
return OneLineReader.getValue(f, false);
}
/*}*/
// droid eris
f = new File("/sys/class/power_supply/battery/smem_text");
if (f.exists()) {
Long value = SMemTextReader.getValue();
if (value != null)
return value;
}
// htc sensation / evo 3d
f = new File("/sys/class/power_supply/battery/batt_attr_text");
if (f.exists())
{
Long value = BattAttrTextReader.getValue();
if (value != null)
return value;
}
// some htc devices
f = new File("/sys/class/power_supply/battery/batt_current");
if (f.exists())
return OneLineReader.getValue(f, false);
// nexus one
f = new File("/sys/class/power_supply/battery/current_now");
if (f.exists())
return OneLineReader.getValue(f, true);
// samsung galaxy vibrant
f = new File("/sys/class/power_supply/battery/batt_chg_current");
if (f.exists())
return OneLineReader.getValue(f, false);
// sony ericsson x10
f = new File("/sys/class/power_supply/battery/charger_current");
if (f.exists())
return OneLineReader.getValue(f, false);
// Nook Color
f = new File("/sys/class/power_supply/max17042-0/current_now");
if (f.exists())
return OneLineReader.getValue(f, false);
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
从API 21开始,我们可以获得以微安为单位的瞬时电池电流,作为整数.开发人员文档
BatteryManager mBatteryManager = (BatteryManager) getSystemService(Context.BATTERY_SERVICE);
Long avgCurrent = null, currentNow = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
avgCurrent = mBatteryManager.getLongProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_AVERAGE);
currentNow = mBatteryManager.getLongProperty(BatteryManager.BATTERY_PROPERTY_CURRENT_NOW);
}
Log.d(TAG, "BATTERY_PROPERTY_CURRENT_AVERAGE = " + avgCurrent + "mAh");
Log.d(TAG, "BATTERY_PROPERTY_CURRENT_NOW = " + currentNow + "mAh");
Run Code Online (Sandbox Code Playgroud)
使用mBatteryManager,您可以获得瞬时当前读数.
测量设备功率和读取功耗以及NEXUS设备上的可用属性.Android开源文档
使用此函数获取所有设备中的电压温度电流。
在OnCreate中注册广播接收器
this.registerReceiver(this.BatteryInfo, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
Run Code Online (Sandbox Code Playgroud)
并创建广播接收器
private BroadcastReceiver BatteryInfo = new BroadcastReceiver() {
@Override
public void onReceive(Context ctxt, Intent intent) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
boolean isPresent = intent.getBooleanExtra("present", false);
Bundle bundle = intent.getExtras();
String str = bundle.toString();
Log.i("Battery Info", str);
if (isPresent) {
int percent = (level * 100) / scale;
technology.setText("Technology: "+bundle.getString("technology"));
voltage.setText("Voltage: "+bundle.getInt("voltage")+"mV");
temp.setText("Temperature: "+bundle.getInt("temperature"));
curent.setText("Current: "+bundle.getInt("current_avg"));
health.setText("Health: "+getHealthString(health_));
charging.setText("Charging: "+getStatusString(status) + "(" +getPlugTypeString(pluggedType)+")");
battery_percentage.setText("" + percent + "%");
} else {
battery_percentage.setText("Battery not present!!!");
}
}
};
private String getPlugTypeString(int plugged) {
String plugType = "Unknown";
switch (plugged) {
case BatteryManager.BATTERY_PLUGGED_AC:
plugType = "AC";
break;
case BatteryManager.BATTERY_PLUGGED_USB:
plugType = "USB";
break;
}
return plugType;
}
private String getHealthString(int health) {
String healthString = "Unknown";
switch (health) {
case BatteryManager.BATTERY_HEALTH_DEAD:
healthString = "Dead";
break;
case BatteryManager.BATTERY_HEALTH_GOOD:
healthString = "Good Condition";
break;
case BatteryManager.BATTERY_HEALTH_OVER_VOLTAGE:
healthString = "Over Voltage";
break;
case BatteryManager.BATTERY_HEALTH_OVERHEAT:
healthString = "Over Heat";
break;
case BatteryManager.BATTERY_HEALTH_UNSPECIFIED_FAILURE:
healthString = "Failure";
break;
}
return healthString;
}
private String getStatusString(int status) {
String statusString = "Unknown";
switch (status) {
case BatteryManager.BATTERY_STATUS_CHARGING:
statusString = "Charging";
break;
case BatteryManager.BATTERY_STATUS_DISCHARGING:
statusString = "Discharging";
break;
case BatteryManager.BATTERY_STATUS_FULL:
statusString = "Full";
break;
case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
statusString = "Not Charging";
break;
}
return statusString;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
65358 次 |
最近记录: |