Android硬件信息获取方法总结

Android硬件信息获取方法总结

以下是一些常见的 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 或唯一标识符(需权限)// 需要权限:

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 sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

for (Sensor sensor : sensors) {

String sensorName = sensor.getName(); // 传感器名称(如 "加速度计")

String sensorVendor = sensor.getVendor();

}7. 屏幕信息分辨率和 DPIDisplayMetrics 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 信息是否支持 GPSLocationManager 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)。

欢迎留言补充其他硬件信息的获取方式。

关注我获取更多知识或者投稿

相关推荐

精英部队好玩吗,深度体验报告:精英部队,射击游戏的魅力再临
江苏省淮安市盱眙县

江苏省淮安市盱眙县

📅 09-09 👁️ 1217
恩佐:从家庭贫困到职业成功,背后的破裂与重生