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厂商对应的内核前缀
MTKmtktscpu
Qualcommtsens_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真正的温度。而获取电池温度的方式,只需要使用电池广播就行了。

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



作者:芥末末的沫
链接:https://www.jianshu.com/p/e946cf746dc0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android 中,获取 CPU 和 GPU 各核的温度可以使用系统提供的接口和传感器来实现。以下是一个示例代码,演示如何获取 CPU 和 GPU 的温度: ```java import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.View; import android.widget.Button; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class TemperatureActivity extends AppCompatActivity { private TextView cpuTempTextView, gpuTempTextView; private Button startButton, stopButton; private Handler mHandler; private Runnable mRunnable; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_temperature); cpuTempTextView = findViewById(R.id.cpu_temp_text_view); gpuTempTextView = findViewById(R.id.gpu_temp_text_view); startButton = findViewById(R.id.start_button); stopButton = findViewById(R.id.stop_button); mHandler = new Handler(Looper.getMainLooper()); startButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startMonitoring(); } }); stopButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { stopMonitoring(); } }); } private void startMonitoring() { mRunnable = new Runnable() { @Override public void run() { float cpuTemp = getCPUTemperature(); float gpuTemp = getGPUTemperature(); cpuTempTextView.setText("CPU Temperature: " + cpuTemp + "°C"); gpuTempTextView.setText("GPU Temperature: " + gpuTemp + "°C"); mHandler.postDelayed(this, 1000); // 每隔1秒更新一次温度 } }; mHandler.post(mRunnable); } private void stopMonitoring() { mHandler.removeCallbacks(mRunnable); } private float getCPUTemperature() { try { File file = new File("/sys/class/thermal/thermal_zone0/temp"); FileInputStream fis = new FileInputStream(file); BufferedReader br = new BufferedReader(new InputStreamReader(fis)); String temp = br.readLine(); br.close(); fis.close(); int cpuTemp = Integer.parseInt(temp); return cpuTemp / 1000.0f; // 将温度转换为摄氏度并返回 } catch (IOException e) { e.printStackTrace(); } return 0.0f; } private float getGPUTemperature() { // 获取 GPU 温度的方法因设备而异,请根据实际情况自行查阅文档或资料 // 并在此处实现获取 GPU 温度的逻辑 // 这里只是一个示例,返回一个固定值 45.5°C return 45.5f; } } ``` 以上示例代码中,通过读取 `/sys/class/thermal/thermal_zone0/temp` 文件来获取 CPU 温度。请注意,不同设备的温度文件路径可能会有所不同,你需要根据实际情况进行调整。对于 GPU 温度获取,因为各个设备的实现方式不同,所以需要根据具体的设备和芯片厂商的文档或资料来查找对应的方法。 在示例中,点击 "Start" 按钮将开始监测 CPU 和 GPU 温度,每秒更新一次,点击 "Stop" 按钮将停止监测。温度数据会显示在对应的 TextView 上。 请注意,在实际应用中,为了确保代码的正常运行和适配不同的设备,你需要添加相应的权限和适配处理。同时,由于涉及到系统底层的温度读取,部分设备可能无法获取到正确的温度值。因此,在实际使用时需要注意测试和适配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安果移不动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值