关于android 电池的一些实用性探讨

     现在网上关于android电池研究的文章大部分都是复制黏贴,10篇9篇是一样的,无趣的很。

     关于电池,你如果只是想知道电池的普通信息,比如说目前电量是多少(百分比形式)这个就很简单,首先注册一个广播

 private void regReceiver() {
  IntentFilter filter = new IntentFilter();
  filter.addAction(Intent.ACTION_BATTERY_CHANGED);
  registerReceiver(new BatteryReceiver(), filter);
 }

写一个广播在receiver写上如下方法

if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
   map = new HashMap<String, Object>();
   /** 电池剩余电量 */
   map.put("level", "" + intent.getIntExtra("level", 0));
   /** 获取电池满电量数值 */
   map.put("scale", "" + intent.getIntExtra("scale", 0));
   /** 获取电池技术支持 */
   map.put("technology", "" + intent.getStringExtra("technology"));
   /** 获取电池状态 */
   map.put("status", ""+ intent.getIntExtra("status",BatteryManager.BATTERY_STATUS_UNKNOWN));
   /** 获取电源信息 */
   map.put("plugType", "" + intent.getIntExtra("plugged", 0));
   /** 获取电池健康度 */
   map.put("health",""+ intent.getIntExtra("health",BatteryManager.BATTERY_HEALTH_UNKNOWN));
   /** 获取电池电压 */
   map.put("voltage", intent.getIntExtra("voltage", 0) + "");
   /** 获取电池温度 */
   map.put("temperature", intent.getIntExtra("temperature", 0) + "");
   
   if (map!=null) {
    message = new Message();
    message.obj = map;
    MainActivity.handler1.dispatchMessage(message);
   }

十分简单。

     下面我们聊聊电池的另外一些技巧

     首先是获取电池容量(毫安时)。首先一种方法用的是PowerProfile(当然你去百度的话,大部分只会告诉你怎么用,而不会告诉你正常情况下根本用不了这个类),这个类是属于com.android.internal这个包,是属于内部api包,不开放使用。我这里网上搜集了一个http://download.csdn.net/detail/lchben/9123641,导入这个包即可(不要放在libs下 而是新建一个同级别的包,比如我的是lib,然后手动导入包),有了这个包我们就可以使用一个方法得到你的电池容量了直接

 System.out.println("电池总量"+powerProfile.getBatteryCapacity());

嘿嘿  如果你多拿几台手机测试 你就会发现,fuck,怎么不准嘞,首先我们看看powerProfile的原理到底是什么,这个类的数据是根据power_profile.xml来解析 获得的,一般是类似展示的数据如下

  1. <device name="Android">  
  2.   <!-- All values are in mA except as noted -->  
  3.   <item name="none">0</item>  
  4.   <item name="screen.on">200</item> <!-- min brite -->  
  5.   <item name="bluetooth.active">150</item>  
  6.   <item name="bluetooth.on">1</item>  
  7.   <item name="bluetooth.at">1</item> <!-- TBD -->  
  8.   <item name="screen.full">160</item> <!-- 360 max on calendar -->  
  9.   <item name="wifi.on">1</item>    <!-- wifi处于开启状态,但未传输数据 -->  
  10.   <item name="wifi.active">150</item>    <!-- wifi处于传输数据状态 -->  
  11.   <item name="wifi.scan">200</item>    <!-- wifi处于搜索热点状态 -->  
  12.   <item name="dsp.audio">150</item>  
  13.   <item name="dsp.video">200</item>  
  14.   <item name="radio.active">150</item>  
  15.   <item name="gps.on">55</item>  
  16.   <item name="battery.capacity">1750</item>  
  17.   <item name="radio.scanning">90</item> <!-- TBD -->  
  18.   <!-- Current consumed by the radio at different signal strengths, when paging  -->  
  19.    <array name="radio.on"> <!-- 1 entry per signal strength bin, TBD -->  
  20.       <value>3.0</value>  
  21.       <value>3.0</value>  
  22.   </array>  
  23.   <array name="cpu.speeds">  
  24.     <value>350000</value>    <!-- 3.5MHz -->  
  25.     <value>700000</value>    <!-- 7.0MHz -->  
  26.     <value>920000</value>    <!-- 9.2MHz -->  
  27.     <value>1200000</value>   <!-- 1.2GHz -->   
  28.   </array>  
  29.   <!-- Power consumption in suspend -->  
  30.   <item name="cpu.idle">7</item>  //cpu空闲时候的消耗
  31.   <!-- Power consumption due to wake lock held -->  
  32.   <item name="cpu.awake">20</item>  
  33.   <!-- Power consumption at different speeds -->  
  34.   <array name="cpu.active">  
  35.       <value>120</value>  
  36.       <value>228</value>  
  37.       <value>299</value>  
  38.       <value>397</value>  
  39.   </array>  
  40. </device>  

理论上来说你还可以获得其他信息 比如说我要知道手机开启wifi时候的消耗直接powerProfile.getAveragePower(powerProfile.POWER_WIFI_ON);即可

  但是不要忘记我们的问题是什么?为什么上面的办法获取电池容量有的手机不准,因为上面的power_profile.xml的文件是各个手机硬件产商写的(硬件消耗只有硬件厂商最清楚不是吗)看到这里你就会知道原因了吧,一些厂商为了某些原因里面的数据随便填写。网上还有很多帖子对这个方法津津乐道 也是醉了(所以才说他们只懂得复制黏贴,试都没试过)。

  好吧 这个时候我们来看另一种思路 首先你得知道android电池更新的一些原理 这里借助网上一张图

 你可以看到虽然这种图画的不完整,但是你可以得知 你所需要的电池信息是在power_supply里面的battery里面 并通过uevent上报。也许你会说这很抽象。我才不会告诉你 你可以直观的看到这些数据 ,手机下载re管理器,进入手机存储(不是sd卡) 路径是sys/class/power_supply/uevent,打开你就发现

里面的POWER_SUPPLY_CHARGE_FULL_DESIGN的值就是理论上电池的容量了POWER_SUPPLY_CHARGE_FULL这个是实际的容量。这里有一段介绍各个字段的值

Power Supply Present(当前电源): 指出存在一个电源。这一事件的值应当始终为 1。
Power Supply Name(电源名称): 电源的名称。以下显示了一些可能指定给能够向设备供电的各种装置的名称,如“电池”、“ac_charger”和“usb”等等。电池是本文的首要关注点。
Power Supply Status(电源状态): 指出设备是否在充电。
Power Supply Technology(电源技术): 电池技术。常见值为 Lithium-Ion (Li-Ion)
Power Supply Voltage Now(当前电源电压): 电池电压,单位为微伏 (uV)。对于其它设备,该值的单位可能为毫伏 (mV)
Power Supply Voltage Avg(电源平均电压): 平均电池电压。
Power_Supply Current Now(当前电源电流): 电池电流,单位为微安 (uA)。
Power Supply Current Avg(平均电源电流): 平均电池电流。
Power Supply Charge Now(当前电源电量): 电池的剩余电量,单位为微安/小时 (uAh)。通常,电池容量的单位为毫安时或瓦时 (Wh)。
Power Supply Capacity(电源容量): 电池的剩余容量百分比。
Power Supply Charge Full(电源充电容量): 电池所能容纳的容量。这通常指电池完全充满电时的电量。

那你如何用代码得知这些数据的 上文我们提到这些数据是通过uevent来上传的这就轻松了

在activity里面的oncreat写上 mUEventObserver.startObserving("SUBSYSTEM=power_supply");

下面实现方法

private UEventObserver mUEventObserver = new UEventObserver() {
        @Override
        public void onUEvent(UEventObserver.UEvent event) {
     

         String Current= event.get("POWER_SUPPLY_CURRENT_NOW");
        String Batterybest= event.get("POWER_SUPPLY_CHARGE_FULL_DESIGN");//理论电池容量
        String Batterytrue= event.get("POWER_SUPPLY_CHARGE_FULL");//进过损耗后电池容量
        if(Current!=null&&!Current.equals("null")){
          System.out.println("电流"+Current);

        }
         if(Batterybest!=null&&!Batterybest.equals("")){
         
          System.out.println("真·电池容量"+Batterybest);
                  }
        }
  };

理论上知道这些你就可以计算一些事情,(比如电池使用时间,电池充电时间)电池容量/每小时的充电电流=充电时间。

这些当然是理论的  因为有的手机根本就没有电流的这个值,目前我还没找到办法,也有一些折中的(比如说得知你是什么充电,usb充电,还是电源充电,用最上边的广播方法可以得知)usb一般是500毫安每小时,电源一般是1000毫安每小时,这可倒是可以糊弄糊弄人。

 还是就是电池的可用时间计算,这个下文在解释




ps:此方法在5.0上面不可用,暂时没有办法解决,目前市面上也没有找到解决办法,至于金山电池医生等应用经过反编译已证实是写死的数据,而不是根据电池来的,不可信


ps:大家有疑问的可在评论者提出,我经常在线的,力所能及的很乐意解答


  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值