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) + "%"); }
踩坑提醒
- 权限限制:普通第三方应用几乎无法拿到
DEVICE_POWER权限,如果你的应用是面向普通用户的,建议考虑替代方案,比如读取系统的/sys/class/thermal/thermal_zoneX/temp文件(不同厂商路径可能不同),但需要注意这类文件的读取权限。 - 空值判断:部分厂商可能没有完全实现这个API,调用方法可能返回
null,所以一定要做好空值和数组长度的判断,避免崩溃。 - 温度类型的区别:
TEMPERATURE_CURRENT是当前温度,TEMPERATURE_THROTTLING是触发CPU降频的温度阈值,TEMPERATURE_SHUTDOWN是触发设备关机的温度阈值,根据需求选择合适的类型。
内容的提问来源于stack exchange,提问作者Serafeim
相关产品推荐
相关产品推荐

