You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 7.0下HardwarePropertiesManager无法正常工作的技术求助

使用HardwarePropertiesManager在Android 7.0(API24)获取硬件信息指南

嘿,我看你正在尝试用HardwarePropertiesManager来获取Android设备的硬件信息,刚好Android 7.0(API24)是这个API首次推出的版本,这里给你梳理下正确的使用姿势、注意事项,还有完整的示例代码:

第一步:添加必要权限

这个API涉及设备的敏感硬件数据,所以必须在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.DEVICE_POWER" />

⚠️ 注意:这是一个签名级权限,意味着你的应用要么是系统应用,要么需要和Android系统使用相同的签名才能获取到这个权限。普通第三方应用大概率会遇到权限被拒绝的情况,这点一定要提前知晓。

第二步:获取HardwarePropertiesManager实例

不能直接实例化这个类,必须通过系统服务来获取:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    TextView helloTV = findViewById(R.id.helloTV);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        // 获取HardwarePropertiesManager服务实例
        HardwarePropertiesManager hardwarePropsManager = 
            (HardwarePropertiesManager) getSystemService(Context.HARDWARE_PROPERTIES_SERVICE);
        
        // 接下来就可以用这个实例获取硬件信息了
    }
}

第三步:获取具体硬件信息的示例

获取CPU温度

可以获取当前CPU温度、降频阈值温度或者关机阈值温度:

// 获取当前CPU温度(单位:摄氏度)
float[] cpuCurrentTemp = hardwarePropsManager.getDeviceTemperatures(
    HardwarePropertiesManager.DEVICE_TEMPERATURE_CPU,
    HardwarePropertiesManager.TEMPERATURE_CURRENT);

if (cpuCurrentTemp != null && cpuCurrentTemp.length > 0) {
    helloTV.setText("当前CPU温度:" + cpuCurrentTemp[0] + "℃");
}

// 获取CPU降频阈值温度
float[] cpuThrottleTemp = hardwarePropsManager.getDeviceTemperatures(
    HardwarePropertiesManager.DEVICE_TEMPERATURE_CPU,
    HardwarePropertiesManager.TEMPERATURE_THROTTLING);

获取电池温度

float[] batteryTemp = hardwarePropsManager.getDeviceTemperatures(
    HardwarePropertiesManager.DEVICE_TEMPERATURE_BATTERY,
    HardwarePropertiesManager.TEMPERATURE_CURRENT);

if (batteryTemp != null && batteryTemp.length > 0) {
    helloTV.append("\n当前电池温度:" + batteryTemp[0] + "℃");
}

获取CPU使用率

返回的是最近一段时间内的CPU空闲时长和总时长,通过计算得到使用率:

long[] cpuUsageData = hardwarePropsManager.getCPUUsages();
if (cpuUsageData != null && cpuUsageData.length >= 2) {
    long idleTime = cpuUsageData[0];
    long totalTime = cpuUsageData[1];
    float usagePercent = 100 * (1 - (float) idleTime / totalTime);
    helloTV.append("\nCPU使用率:" + String.format("%.1f", usagePercent) + "%");
}

踩坑提醒

  1. 权限限制:普通第三方应用几乎无法拿到DEVICE_POWER权限,如果你的应用是面向普通用户的,建议考虑替代方案,比如读取系统的/sys/class/thermal/thermal_zoneX/temp文件(不同厂商路径可能不同),但需要注意这类文件的读取权限。
  2. 空值判断:部分厂商可能没有完全实现这个API,调用方法可能返回null,所以一定要做好空值和数组长度的判断,避免崩溃。
  3. 温度类型的区别:TEMPERATURE_CURRENT是当前温度,TEMPERATURE_THROTTLING是触发CPU降频的温度阈值,TEMPERATURE_SHUTDOWN是触发设备关机的温度阈值,根据需求选择合适的类型。

内容的提问来源于stack exchange,提问作者Serafeim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:09:02