Android獲取手機(jī)Cpu溫度

在最近的項(xiàng)目中冯勉,需要獲取手機(jī)當(dāng)前Cpu溫度,網(wǎng)上也有很多文章介紹轴猎,這里記錄一下莉钙。

獲取CPU溫度的方式:

在Android系統(tǒng)中廓脆,獲取CPU溫度的方法并沒有直接提供給我們開發(fā)者,我們可以通過兩種方式來獲取Cpu溫度:

  • 1磁玉、 通過讀取手機(jī)傳感器sensor的溫度近似于手機(jī)CPU溫度(當(dāng)然這種方式只是一個(gè)近似的值停忿,并不準(zhǔn)確,同時(shí)還需要手機(jī)具備相應(yīng)的傳感器)
  • 2蚊伞、 通過讀取CPU信息來獲取(這種方式相較于前一種方式獲取到的數(shù)據(jù)準(zhǔn)確很多席赂,但是還是有一定的局限性。)

通過兩種方式獲取溫度:

傳感器(Sensor):

眾所周知时迫,我們的Android手機(jī)有很多的傳感器(陀螺儀颅停,距離,溫度傳感等)掠拳,如果我們可以判斷手機(jī)上有我們需要的溫度傳感器癞揉,我們就可以通過溫度傳感器獲取到我們手機(jī)的大致溫度。而要想知道我們手機(jī)上是否具備我們所需的傳感器溺欧,那我們就需要去遍歷一下我們手機(jī)設(shè)備的傳感器了烧董。

  • 使用SensorManager,我們可以遍歷出設(shè)備所有的傳感器胧奔,名字,類型等预吆。

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

通過getSensorList方法我們就可以獲取到我們所有的傳感器龙填。獲取到所有傳感器列表之后,我們?cè)鯓优袛鄠鞲衅鞯念愋湍兀?/strong>

    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關(guān)鍵字的sensor付給了變量mTempSensor 
                // 而這個(gè)mTempSensor 就是我們需要的溫度傳感器
                mTempSensor = s;
            }
        } else {
            typeName = SensorTypeName.getSensorTypeName(s.getType()) + " " + s.getType();
        }
        sb.append(String.format("\t類型:%s\n", typeName));
        sb.append(String.format("\t設(shè)備名稱:%s\n", s.getName()));
        sb.append(String.format("\t設(shè)備版本:%s\n", s.getVersion()));
        sb.append(String.format("\t供應(yīng)商:%s\n", s.getVendor()));
        sb.append("\n");
    }
    // 這里我們將所有的傳感器都放在一個(gè)subStr中岩遗,方便查看我們的結(jié)果
    tx1.setText(sb.toString());
    // 如果傳感器不為空,那么我們就可添加一個(gè)監(jiān)聽凤瘦,獲取傳感器的溫度情況
    if (mTempSensor != null) {
        sm.registerListener(mSensorEventListener, mTempSensor
                , SensorManager.SENSOR_DELAY_GAME);
    }
    // 溫度傳感器的監(jiān)聽器
    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) {
                  /*溫度傳感器返回當(dāng)前的溫度宿礁,單位是攝氏度(°C)。*/
                  float temperature = event.values[0];
                  Log.e("temperature: ", temperature);
                  sm.unregisterListener(mSensorEventListener, mTempSensor);
              }
          }
      }

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

到此蔬芥,就是通過傳感器獲取手機(jī)大致的溫度梆靖。
但是在實(shí)際的開發(fā)調(diào)試過程中控汉,很多手機(jī)是沒有溫度傳感器的。那此時(shí)返吻,就只有通過直接讀取Cpu信息來獲取手機(jī)的CPU溫度了姑子。

讀取CPU內(nèi)核信息獲取溫度:

讀取手機(jī)CPU信息獲取溫度,我們需要獲取的是手機(jī)CPU內(nèi)核(thermal)的信息测僵,而這個(gè)信息是存儲(chǔ)在手機(jī)的/sys節(jié)點(diǎn)目錄中的街佑。有開發(fā)經(jīng)驗(yàn)的朋友就知道,讀取手機(jī)緩存中的文件是需要有權(quán)限的捍靠。而這個(gè)權(quán)限是需要su權(quán)限沐旨,也就是root權(quán)限。那換而言之榨婆,一般的手機(jī)是讀取不到這個(gè)節(jié)點(diǎn)信息的磁携。這里也是一個(gè)坑,需要注意纲辽。

讀取路徑:/sys/class/thermal/thermal_zone*
這里的*對(duì)應(yīng)了手機(jī)的內(nèi)核文件夾編號(hào)颜武,例如某些手機(jī)的*可能有17個(gè)(0~16),但是需要注意的是并不是所有的文件夾都是存儲(chǔ)CPU內(nèi)核的信息

那怎么判斷哪個(gè)文件夾目錄使我們需要獲取的信息目錄呢拖吼?

這里介紹一個(gè)方式:
我們都知道鳞上,現(xiàn)在手機(jī)的處理器要不是高通(Qualcomm),要不是聯(lián)發(fā)科(MTK)吊档,當(dāng)然還有其他的類型篙议,但是市場主流是上邊的兩個(gè)。而這兩個(gè)CPU內(nèi)核都有固定的名字怠硼。
我們可以通過cat命令讀取/sys/class/thermal/thermal_zone*/type獲取到的字符串來判斷是哪種類型的CPU鬼贱。也可以判斷該目錄是否是CPU內(nèi)核信息。

CPU廠商 對(duì)應(yīng)的內(nèi)核前綴
MTK mtktscpu
Qualcomm tsens_tz_sensor
Exynos(三星) exynos

不要問我怎么來的香璃,多使用ADB真機(jī)調(diào)試这难,使用以上的命令你也可以總結(jié)出來這些東西。

ADB SHELL THERMAL.png

通過for循環(huán)葡秒,遍歷thermal_zone姻乓,cat type出來的信息判斷是否包含了以上兩種CPU的關(guān)鍵字,則可以判斷該目錄是否保存了CPU內(nèi)核信息眯牧。
只要判斷了那些目錄是屬于內(nèi)核信息的蹋岩,獲取溫度就手到拈來。只需要cat另一個(gè)參數(shù)temp那么輸出的信息就是我們需要的溫度啦学少。

奏是這么簡單剪个。

image.png

還有一點(diǎn)需要注意的是,某些手機(jī)返回回來的參數(shù)(很多情況下是thermal_zone0)是精確到小數(shù)點(diǎn)后3位版确,但是沒有小數(shù)點(diǎn)扣囊,例如45300乎折,其實(shí)是45.3℃。這里需要轉(zhuǎn)換如暖。

Android應(yīng)用使用ADB命令笆檀,這個(gè)就不用再提了吧,使用FileInputStream盒至、InputStreamReader酗洒、BufferedReader來讀取應(yīng)該大家都會(huì)。如果不會(huì)百度下也是很快就能搞定的枷遂。

對(duì)于沒有權(quán)限的手機(jī):

現(xiàn)在市面上有很多安全清理軟件都是有CPU溫度監(jiān)控的模塊樱衷,而他們獲取的溫度,可能是使用batteryTemp代替了CPU真正的溫度酒唉。而獲取電池溫度的方式矩桂,只需要使用電池廣播就行了。

最后代碼就不貼了痪伦,原理就是這樣侄榴。希望能幫助到有需要的朋友。老是復(fù)制粘貼哪有自己碼代碼有意思是吧网沾。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末癞蚕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辉哥,更是在濱河造成了極大的恐慌桦山,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件醋旦,死亡現(xiàn)場離奇詭異恒水,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饲齐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門钉凌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捂人,你說我怎么就攤上這事御雕。” “怎么了先慷?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咨察。 經(jīng)常有香客問我论熙,道長,這世上最難降的妖魔是什么摄狱? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任脓诡,我火速辦了婚禮无午,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘祝谚。我一直安慰自己宪迟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布交惯。 她就那樣靜靜地躺著次泽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪席爽。 梳的紋絲不亂的頭發(fā)上意荤,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音只锻,去河邊找鬼玖像。 笑死,一個(gè)胖子當(dāng)著我的面吹牛齐饮,可吹牛的內(nèi)容都是我干的捐寥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祖驱,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼握恳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起羹膳,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤睡互,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后陵像,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體就珠,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年醒颖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妻怎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泞歉,死狀恐怖逼侦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腰耙,我是刑警寧澤榛丢,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站挺庞,受9級(jí)特大地震影響晰赞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一掖鱼、第九天 我趴在偏房一處隱蔽的房頂上張望然走。 院中可真熱鬧,春花似錦戏挡、人聲如沸芍瑞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拆檬。三九已至,卻和暖如春掌栅,著一層夾襖步出監(jiān)牢的瞬間秩仆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工猾封, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澄耍,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓晌缘,卻偏偏與公主長得像齐莲,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磷箕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,101評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理选酗,服務(wù)發(fā)現(xiàn),斷路器岳枷,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 想象一下芒填,假如你一個(gè)人流落孤島,你會(huì)想些什么空繁?做些什么殿衰?會(huì)遇到什么事呢?孩子在《魯賓遜漂流記》這本書里找到了答案盛泡。...
    低若塵埃燦若星閱讀 196評(píng)論 0 0
  • 今年好像注定就是要和小孩子打交道的一年闷祥,從寒假在服裝店里接觸了幾個(gè)小屁孩從此懷念小時(shí)候而淚如雨下之后就知道這好像是...
    薩拉_babe閱讀 149評(píng)論 0 0
  • 如果不是日有所思夜有所夢(mèng),那么每次醒來能記住的那些夢(mèng)境傲诵,又暗示著什么呢凯砍? 一頓爭吵后,我推門從家落荒而逃拴竹,原來生活...
    牡丹亭外的三旬閱讀 465評(píng)論 0 0