Android获取手机Cpu温度

在最近的项目中,需要获取手机当前Cpu温度,网上也有很多文章介绍,这里记录一下。

获取CPU温度的方式:

在Android系统中,获取CPU温度的方法并没有直接提供给我们开发者,我们可以通过两种方式来获取Cpu温度:

  • 1、 通过读取手机传感器sensor的温度近似于手机CPU温度(当然这种方式只是一个近似的值,并不准确,同时还需要手机具备相应的传感器)
  • 2、 通过读取CPU信息来获取(这种方式相较于前一种方式获取到的数据准确很多,但是还是有一定的局限性。)

通过两种方式获取温度:

传感器(Sensor):

众所周知,我们的Android手机有很多的传感器(陀螺仪,距离,温度传感等),如果我们可以判断手机上有我们需要的温度传感器,我们就可以通过温度传感器获取到我们手机的大致温度。而要想知道我们手机上是否具备我们所需的传感器,那我们就需要去遍历一下我们手机设备的传感器了。

  • 使用SensorManager,我们可以遍历出设备所有的传感器,名字,类型等。

    SensorManager mSmanager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    List<Sensor> allSensors = sm.getSensorList(Sensor.TYPE_ALL);
    

通过getSensorList方法我们就可以获取到我们所有的传感器。获取到所有传感器列表之后,我们怎样判断传感器的类型呢?

    for (Sensor s : allSensors) {
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            typeName = SensorTypeName.getSensorTypeName(s.getType()) + " " + s.getStringType();
            if (s.getStringType().toUpperCase().indexOf("TEMP") > 0) {
                // 可以看到,这里将包含有TEMP关键字的sensor付给了变量mTempSensor 
                // 而这个mTempSensor 就是我们需要的温度传感器
                mTempSensor = s;
            }
        } else {
            typeName = SensorTypeName.getSensorTypeName(s.getType()) + " " + s.getType();
        }
        sb.append(String.format("\t类型:%s\n", typeName));
        sb.append(String.format("\t设备名称:%s\n", s.getName()));
        sb.append(String.format("\t设备版本:%s\n", s.getVersion()));
        sb.append(String.format("\t供应商:%s\n", s.getVendor()));
        sb.append("\n");
    }
    // 这里我们将所有的传感器都放在一个subStr中,方便查看我们的结果
    tx1.setText(sb.toString());
    // 如果传感器不为空,那么我们就可添加一个监听,获取传感器的温度情况
    if (mTempSensor != null) {
        sm.registerListener(mSensorEventListener, mTempSensor
                , SensorManager.SENSOR_DELAY_GAME);
    }
    // 温度传感器的监听器
    private final SensorEventListener mSensorEventListener = new SensorEventListener() {
      @Override
      public void onSensorChanged(SensorEvent event) {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
              if (event.sensor.getStringType().toUpperCase().indexOf("TEMP") > 0) {
                  /*温度传感器返回当前的温度,单位是摄氏度(°C)。*/
                  float temperature = event.values[0];
                  Log.e("temperature: ", temperature);
                  sm.unregisterListener(mSensorEventListener, mTempSensor);
              }
          }
      }

      @Override
      public void onAccuracyChanged(Sensor sensor, int accuracy) {
      }
  };

到此,就是通过传感器获取手机大致的温度。
但是在实际的开发调试过程中,很多手机是没有温度传感器的。那此时,就只有通过直接读取Cpu信息来获取手机的CPU温度了。

读取CPU内核信息获取温度:

读取手机CPU信息获取温度,我们需要获取的是手机CPU内核(thermal)的信息,而这个信息是存储在手机的/sys节点目录中的。有开发经验的朋友就知道,读取手机缓存中的文件是需要有权限的。而这个权限是需要su权限,也就是root权限。那换而言之,一般的手机是读取不到这个节点信息的。这里也是一个坑,需要注意。

读取路径:/sys/class/thermal/thermal_zone*
这里的*对应了手机的内核文件夹编号,例如某些手机的*可能有17个(0~16),但是需要注意的是并不是所有的文件夹都是存储CPU内核的信息

那怎么判断哪个文件夹目录使我们需要获取的信息目录呢?

这里介绍一个方式:
我们都知道,现在手机的处理器要不是高通(Qualcomm),要不是联发科(MTK),当然还有其他的类型,但是市场主流是上边的两个。而这两个CPU内核都有固定的名字。
我们可以通过cat命令读取/sys/class/thermal/thermal_zone*/type获取到的字符串来判断是哪种类型的CPU。也可以判断该目录是否是CPU内核信息。

CPU厂商 对应的内核前缀
MTK mtktscpu
Qualcomm tsens_tz_sensor
Exynos(三星) exynos

不要问我怎么来的,多使用ADB真机调试,使用以上的命令你也可以总结出来这些东西。

ADB SHELL THERMAL.png

通过for循环,遍历thermal_zonecat type出来的信息判断是否包含了以上两种CPU的关键字,则可以判断该目录是否保存了CPU内核信息。
只要判断了那些目录是属于内核信息的,获取温度就手到拈来。只需要cat另一个参数temp那么输出的信息就是我们需要的温度啦。

奏是这么简单。

image.png

还有一点需要注意的是,某些手机返回回来的参数(很多情况下是thermal_zone0)是精确到小数点后3位,但是没有小数点,例如45300,其实是45.3℃。这里需要转换。

Android应用使用ADB命令,这个就不用再提了吧,使用FileInputStreamInputStreamReaderBufferedReader来读取应该大家都会。如果不会百度下也是很快就能搞定的。

对于没有权限的手机:

现在市面上有很多安全清理软件都是有CPU温度监控的模块,而他们获取的温度,可能是使用batteryTemp代替了CPU真正的温度。而获取电池温度的方式,只需要使用电池广播就行了。

最后代码就不贴了,原理就是这样。希望能帮助到有需要的朋友。老是复制粘贴哪有自己码代码有意思是吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,563评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 想象一下,假如你一个人流落孤岛,你会想些什么?做些什么?会遇到什么事呢?孩子在《鲁宾逊漂流记》这本书里找到了答案。...
    低若尘埃燦若星阅读 184评论 0 0
  • 今年好像注定就是要和小孩子打交道的一年,从寒假在服装店里接触了几个小屁孩从此怀念小时候而泪如雨下之后就知道这好像是...
    萨拉_babe阅读 132评论 0 0
  • 如果不是日有所思夜有所梦,那么每次醒来能记住的那些梦境,又暗示着什么呢? 一顿争吵后,我推门从家落荒而逃,原来生活...
    牡丹亭外的三旬阅读 441评论 0 0