获取Android设备当前CPU温度

3
我写了一个在安卓上读取CPU温度的代码。但是出现了以下错误:
java.io.FileNotFoundException: /sys/devices/virtual/thermal/thermal_zone0/temp: 打开失败: EACCES (被拒绝的权限)
private double getCurrentCPUTemperature() throws IOException, InterruptedException {
    ArrayList <Float> suhu = new ArrayList<>();
    Process process;
    String line;
    BufferedReader reader;
    RandomAccessFile reader1;
    for (int i = 0; i <= 30 ; i ++ ) {
        process = Runtime.getRuntime().exec("cat /sys/devices/virtual/thermal/thermal_zone" + i + "/temp");
        process.waitFor();
        reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        line = reader.readLine();
        System.out.println("Line = " + line);
        if(line != null){
            Float temp = Float.parseFloat(line);
            suhu.add(temp);
        }
        if(line == null){
            reader1 = new RandomAccessFile("/sys/devices/virtual/thermal/thermal_zone" + i +"/temp", "r");
            line = reader.readLine();
            if (line != null){
                System.out.println(line + " RAM");
                Float temp1 = Float.parseFloat(line);
                suhu.add(temp1);
            }
        }
        if (i == 30){
            reader.close();
            process.destroy();
        }
    }
    double temp = 0.0;
    for (int i = 0; i < suhu.size() ; i++){
        if (suhu.get(i) > temp){
            temp = (double) suhu.get(i);
        }
    }
    System.out.println(suhu);
    return temp;
}

我已经请求了读写外部存储的权限。

清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.gpc1">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"

在活动中

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_sensor);
    BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
    bottomNavigationView.setSelectedItemId(R.id.page_2);
    bottomNavigationView.setOnNavigationItemSelectedListener(this);

    requestPermissionStorage();

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(requestCode == STORAGE_PERMISSION_CODE){
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            requestPermissionStorage();
        } else {
            Toast.makeText(this, "Permission DENIED", Toast.LENGTH_SHORT).show();
        }
    }
}

private void requestPermissionStorage() {
    if (ActivityCompat.checkSelfPermission(this,
            Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    }
    else {
        System.out.println("Request External Storage");
    }
}

感谢您的帮助,我很感激。

请将以下有关编程的内容从英语翻译成中文。只需返回翻译后的文本即可,不必为您的英语表达道歉,我们都来自不同的背景 :) - a_local_nobody
谢谢:D 很高兴见到好人 - Boma Anjang
1个回答

0

您可以使用TYPE_AMBIENT_TEMPERATURE来获取电池或CPU温度。TYPE_TEMPERATURE是已弃用的常量。

文档中提供的修改后的代码应该像这样:

import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class TempSensorActivity extends Activity, implements SensorEventListener {
 private final SensorManager mSensorManager;
 private final Sensor mTempSensor;

 public TempSensorActivity() {
     mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE);
     mTempSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);
 }

 protected void onResume() {
     super.onResume();
     mSensorManager.registerListener(this, mTempSensor, SensorManager.SENSOR_DELAY_NORMAL);
 }

 protected void onPause() {
     super.onPause();
     mSensorManager.unregisterListener(this);
 }

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

 public void onSensorChanged(SensorEvent event) {
 }
}

查看传感器文档以获取更多信息


感谢您的回答。我尝试使用了TYPE_AMBIENT_TEMPERATURE和TYPE_TEMPERATURE,但它们返回了空结果。我想要从像这个链接[link](https://dev59.com/DWIi5IYBdhLWcg3w9wYU#59306562)中提供的文件中读取CPU温度。 - Boma Anjang
1
根据型号的不同,您可能无法访问/sys/devices/virtual/thermal目录。在您的情况下,您无法访问该目录,因为制造商已经阻止了它。获取温度的唯一官方方法是使用TYPE_AMBIENT_TEMPERATURE解决方案,即使并非所有制造商都实现了它。 - dgp
感谢您的回答,@dgp先生。我尝试了不同版本的安卓系统。不同的安卓系统可以提供温度值... - Boma Anjang
这看起来非常像是抄袭了这个答案,没有适当地链接它,不好。 - Antonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接