现在网上关于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:大家有疑问的可在评论者提出,我经常在线的,力所能及的很乐意解答

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

  1. 【转】android电池(四):电池 电量计(MAX17040)驱动分析篇

    关键词:android 电池  电量计  MAX17040 任务初始化宏 power_supply 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  ...

  2. android电池(五):电池 充电IC(PM2301)驱动分析篇

    android电池(五):电池 充电IC(PM2301)驱动分析篇 关键词:android 电池  电量计  PL2301任务初始化宏 power_supply 中断线程化 平台信息: 内核:linu ...

  3. android 电池(三):android电池系统

    android 电池(三):android电池系统 关键词:android电池系统电池系统架构 uevent power_supply驱动 平台信息: 内核:linux2.6/linux3.0 系统: ...

  4. android 电池(一):锂电池基本原理篇 .

    http://blog.csdn.net/xubin341719/article/details/8497830 关键词:android  电池关机充电 androidboot.mode charge ...

  5. Android 电池管理

    Android4.4电池管理 一.概述 Android4.4的电池管理功能用于管理电池的充.放电功能.整个电池管理的部分包括Linux电池驱动.Android电池服务.电池属性和参数.电池曲线优化四个 ...

  6. android 电池(一):锂电池基本原理篇

    关键词:android  电池关机充电 androidboot.mode charger 平台信息: 内核:linux2.6/linux3.0 系统:android/android4.0  平台:S5 ...

  7. android电池管理软件,Android实现电池管理系统

    一.Android 电池服务 Android电池服务,用来监听内核上报的电池事件,并将最新的电池数据上报给系统,系统收到新数据后会去更新电池显示状态.剩余电量等信息.如果收到过温报警和低电报警,系统会 ...

  8. Android 电池管理系统

    一.Android 电池服务 Android电池服务,用来监听内核上报的电池事件,并将最新的电池数据上报给系统,系统收到新数据后会去更新电池显示状态.剩余电量等信息.如果收到过温报警和低电报警,系统会 ...

  9. Android电池管理系统框架整理

    一.Android 电池服务 Android电池服务,用来监听内核上报的电池事件,并将最新的电池数据上报给系统,系统收到新数据后会去更新电池显示状态.剩余电量等信息.如果收到过温报警和低电报警,系统会 ...

最新文章

  1. 【Python】ubuntu14安装pycaffe环境:python2.7及依赖库
  2. 200行代码解读TDEngine背后的定时器
  3. P1024 一元三次方程求解(递归式二分)
  4. Java-NIO(九):管道 (Pipe)
  5. vivado与modelsim的联合仿真(一)
  6. 罗莎琳德·富兰克林:隐于幕后的DNA之母,以及她被误解却又伟大的短暂一生...
  7. go语言net包rpc远程调用的使用
  8. struts2的两个核心配置文件
  9. 用递归来实现汉诺塔的问题
  10. Reflection conclusion
  11. 在 Vue3 成为默认版本后,盘点了 Vue3 与 Vue2 的区别
  12. C10K 问题引发的技术变革
  13. 罗马数字 古罗马数字转换为阿拉伯数字
  14. 如果家庭中一台台式计算机,中国家用电脑调查分析报告
  15. Developing Backbone.js Applications
  16. 【愚公系列】2023年02月 WMS智能仓储系统-015.基础设置(货主信息、运费设置、客户信息)
  17. Window平台下的静默下载并安装软件脚本bat
  18. 超融合服务器怎么上传文件,服务器虚拟化 超融合
  19. MongoDB与亚马逊云科技扩大全球合作
  20. 笔记本win10引用账户当前已锁定,且可能无法登录(已解决)

热门文章

  1. NI LabVIEW 2014SP1视觉开发必备软件和工具包
  2. 玩机器人可以学到什么?
  3. int, long, long long类型的范围
  4. 作也 努力努力在努力
  5. 【持股】k线图基础知识k线基本形态分析
  6. 链表实现学生信息管理系统
  7. 卡特兰数(c++实现)
  8. 回放线上流量利器-GoReplay
  9. Python自学笔记6:实操案例三(十进制转换二、八、十六进制),手机充值,计算能量消耗,预测未来子女身高
  10. lv_canvas 画布