以下是一些常见的 Android 硬件信息获取方式,涵盖设备基本信息、传感器、存储、网络等模块。代码示例基于 Java/Kotlin,需注意权限和 Android 版本兼容性。
1. 设备基本信息
设备型号和厂商
// Java
String model = Build.MODEL; // 设备型号(如 "Pixel 6")
String manufacturer = Build.MANUFACTURER; // 厂商(如 "Google")
Android 系统版本
String osVersion = Build.VERSION.RELEASE; // 系统版本(如 "13")
int sdkVersion = Build.VERSION.SDK_INT; // SDK 版本(如 33)
IMEI 或唯一标识符(需权限)
// 需要权限:<uses-permission android:name="android.permission.READ_PHONE_STATE" />
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = telephonyManager.getImei(); // 注意 Android 10+ 限制
2. CPU 信息
CPU 核心数和架构
// 获取 CPU 核心数(逻辑核心)
int cores = Runtime.getRuntime().availableProcessors();
// CPU 架构(如 "arm64-v8a")
String cpuAbi = Build.SUPPORTED_ABIS[0];
CPU 频率和型号
通过读取系统文件 /proc/cpuinfo
:
try (BufferedReader reader = new BufferedReader(new FileReader("/proc/cpuinfo"))) {
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("model name")) {
String cpuModel = line.split(":")[1].trim();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
3. 内存信息
总内存和可用内存
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
activityManager.getMemoryInfo(memoryInfo);
long totalMemory = memoryInfo.totalMem; // 总内存(字节)
long availableMemory = memoryInfo.availMem; // 可用内存(字节)
4. 存储信息
内部存储空间
StatFs statFs = new StatFs(Environment.getDataDirectory().getPath());
long totalInternal = statFs.getTotalBytes(); // 总内部存储
long freeInternal = statFs.getFreeBytes(); // 可用空间
外部存储(如 SD 卡)
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
StatFs externalStatFs = new StatFs(Environment.getExternalStorageDirectory().getPath());
long totalExternal = externalStatFs.getTotalBytes();
long freeExternal = externalStatFs.getFreeBytes();
}
5. 电池信息
电量和充电状态
IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = context.registerReceiver(null, filter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); // 当前电量百分比
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level * 100 / (float) scale;
int status = batteryStatus.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING;
6. 传感器信息
列出所有传感器
SensorManager sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensors) {
String sensorName = sensor.getName(); // 传感器名称(如 "加速度计")
String sensorVendor = sensor.getVendor();
}
7. 屏幕信息
分辨率和 DPI
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int widthPixels = metrics.widthPixels; // 屏幕宽度(像素)
int heightPixels = metrics.heightPixels; // 屏幕高度
float density = metrics.density; // 密度(1.0 = mdpi)
int densityDpi = metrics.densityDpi; // DPI(如 440)
屏幕刷新率
Display display = getWindowManager().getDefaultDisplay();
float refreshRate = display.getRefreshRate(); // 刷新率(Hz)
8. 网络信息
网络类型和状态
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = cm.getActiveNetworkInfo();
boolean isConnected = networkInfo != null && networkInfo.isConnected();
String networkType = networkInfo.getTypeName(); // 如 "WIFI" 或 "MOBILE"
Wi-Fi 信号强度
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int rssi = wifiInfo.getRssi(); // 信号强度(dBm)
int signalLevel = WifiManager.calculateSignalLevel(rssi, 5); // 转换为 0-4 等级
9. 摄像头信息
摄像头分辨率
CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
String[] cameraIds = cameraManager.getCameraIdList();
for (String cameraId : cameraIds) {
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size[] resolutions = map.getOutputSizes(ImageFormat.JPEG);
}
10. GPS 信息
是否支持 GPS
LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
boolean hasGps = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
11、检测是手机还是平板
Android中没有提供特定的方法来判断设备是手机还是平板,只能通过别的方式来间接判断,比如通过判断屏幕尺寸
infoText.text = checkIsTablet()private fun checkIsTablet(): String { val metrics = resources.displayMetrics val widthInches = metrics.widthPixels / metrics.xdpi val heightInches = metrics.heightPixels / metrics.ydpi val diagonalInches = sqrt(widthInches.pow(2.0f) + heightInches.pow(2.0f)) return if (diagonalInches >= 7.0) { "手机还是平板:平板" } else { "手机还是平板:手机" }}
12、判断是否为折叠屏
其实在折叠屏没出现的时候,判断手机或者是平板使用上述方法还是够用的,但是在折叠屏面前就显得信心不足了,折叠屏一展开,那就是一个长着平板脸的手机,为了识别折叠屏,Android10出来了一个新的感应器类型TYPE_HINGE_ANGLE
,可以通过是否存在这种感应器来识别折叠屏
private fun checkIsFoldScreen(): String { val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager val hingeAngleSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE) return if (hingeAngleSensor == null) { "是否折叠屏:否" } else { "是否折叠屏: 是" }}
13、检测设备是否root
同样的没有任何api可以直接去判断设备是否有root权限,我们只能从以下几个方式去判断
判断检查是否存在相关root文件
var fileRooted = falseval paths = arrayOf( "/system/app/Superuser.apk", "/sbin/su", "/system/bin/su", "/system/xbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su", "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su")for (path in paths) { if (File(path).exists()) { fileRooted = true }}
检查是否存在su命令
var suCmdExest = falsevar process: Process? = nulltry { process = Runtime.getRuntime().exec(arrayOf("which", "su")) val reader = BufferedReader(InputStreamReader(process.inputStream)) suCmdExest = reader.readLine() != null} catch (e: Exception) { suCmdExest = false} finally { process?.destroy()}
检查
Build.TAGS
里面是否存在test-keys
var testKeys = falseval buildTags = Build.TAGStestKeys = buildTags != null && buildTags.contains("test-keys")
执行su命令
var suCmdExecute = falsevar suprocess: Process? = nulltry { suprocess = Runtime.getRuntime().exec("su") val out = suprocess.outputStream out.write("exit\n".toByteArray()) out.flush() out.close() suCmdExecute = suprocess.waitFor() == 0} catch (e: java.lang.Exception) { suCmdExecute = false} finally { process?.destroy()}
Magisk 文件是否存在
var giskFile = falseval magiskPaths = arrayOf( "/sbin/.magisk", "/sbin/magisk", "/cache/.disable_magisk", "/cache/magisk.log", "/data/adb/magisk", "/data/adb/modules", "/data/magisk", "/data/magisk.img")for (path in magiskPaths) { if (File(path).exists()) { giskFile = true }}
保险起见,可以把上述几个变量放在一起判断设备是否有root权限
val gotRoot = fileRooted || suCmdExest || testKeys || suCmdExecute || giskFile
注意事项
权限管理:部分信息需要动态申请权限(如
READ_PHONE_STATE
、ACCESS_FINE_LOCATION
)。版本兼容性:某些 API 在低版本不可用(如
Build.SUPPORTED_ABIS
需要 API 21+)。设备差异:不同厂商可能隐藏部分硬件信息。
建议在关键代码中添加 try-catch
块处理可能的异常(如 SecurityException
)。
欢迎留言补充其他硬件信息的获取方式。
关注我获取更多知识或者投稿