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 或唯一标识符(需权限)
// 需要权限:<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

注意事项

  1. 权限管理:部分信息需要动态申请权限(如 READ_PHONE_STATEACCESS_FINE_LOCATION)。

  2. 版本兼容性:某些 API 在低版本不可用(如 Build.SUPPORTED_ABIS 需要 API 21+)。

  3. 设备差异:不同厂商可能隐藏部分硬件信息。

建议在关键代码中添加 try-catch 块处理可能的异常(如 SecurityException)。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值