Never_chan 2017-10-18 06:57 采纳率: 71.4%
浏览 1128
已采纳

android最小单元的电池电压值

谁能告诉我android最小单元的电池电压值是多少??请提供资料证明,急急急~

  • 写回答

3条回答 默认 最新

  • Kevin_成小浩 2017-10-18 07:10
    关注

    我不知道android 最小单元是多少,下面的代码是可以获取电源电压,温度等等信息。
    首先注册一个广播
    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();
    /** 电池剩余电量 /
    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来解析 获得的,一般是类似展示的数据如下


    <!-- All values are in mA except as noted -->

    0

    200 <!-- min brite -->

    150

    1

    1 <!-- TBD -->

    160 <!-- 360 max on calendar -->

    1 <!-- wifi处于开启状态,但未传输数据 -->

    150 <!-- wifi处于传输数据状态 -->

    200 <!-- wifi处于搜索热点状态 -->

    150

    200

    150

    55

    1750

    90 <!-- TBD -->

    <!-- Current consumed by the radio at different signal strengths, when paging -->

    <!-- 1 entry per signal strength bin, TBD -->

    3.0

    3.0





    350000 <!-- 3.5MHz -->

    700000 <!-- 7.0MHz -->

    920000 <!-- 9.2MHz -->

    1200000 <!-- 1.2GHz -->



    <!-- Power consumption in suspend -->

    7 //cpu空闲时候的消耗
    <!-- Power consumption due to wake lock held -->

    20

    <!-- Power consumption at different speeds -->



    120

    228

    299

    397



    理论上来说你还可以获得其他信息 比如说我要知道手机开启wifi时候的消耗直接powerProfile.getAveragePower(powerProfile.POWER_WIFI_ON);即可
    但是不要忘记我们的问题是什么?为什么上面的办法获取电池容量有的手机不准,因为上面的power_profile.xml的文件是各个手机硬件产商写的(硬件消耗只有硬件厂商最清楚不是吗)看到这里你就会知道原因了吧,一些坑比厂商为了某些原因里面的数据随便填写(比如说小米,我才不会告诉你我的小米note电池容量1390)。网上还有很多帖子对这个方法津津乐道 也是醉了(所以才说他们只懂得复制黏贴,试都没试过)。
    好吧 这个时候我们来看另一种思路 首先你得知道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上面不可用,暂时没有办法解决,目前市面上也没有找到解决办法,至于金山电池医生等应用经过反编译已证实是写死的数据,而不是根据电池来的,不可信

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行