【Settings】Android 设备信息相关参数的获取

在Android应用开发中,获取设备信息是实现设备适配、性能优化和功能开发的基础。本文将系统梳理Android设备信息的获取方法,涵盖设备基本信息、硬件参数、系统信息、应用信息等核心模块,并提供完整的代码示例和最佳实践。

【Settings】Android 设备信息相关参数的获取

  • [1. 设备联网方式](#1. 设备联网方式)
  • [2. 网络连接强度](#2. 网络连接强度)
  • [3. 移动网络类型](#3. 移动网络类型)
  • [4. 设备SN号](#4. 设备SN号)
  • [5. 设备电量](#5. 设备电量)
  • [6. 开机时长](#6. 开机时长)
  • [7. 设备IP地址](#7. 设备IP地址)

1. 设备联网方式

java 复制代码
private int mCurrentNetworkType = -1; // -1: NO, 1: WIFI, 2: MOBILE, 3:ETHER

private int checkConnectionType() {
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    Network activeNetwork = cm.getActiveNetwork();
    NetworkCapabilities nc = cm.getNetworkCapabilities(activeNetwork);
    String typeStr = getString(R.string.self_diagnosis_network_type_no);
    boolean isConnected = false;
    mCurrentNetworkType = -1;
    if (nc != null) {
        if (nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
            typeStr = getString(R.string.self_diagnosis_network_type_wifi);
            isConnected = true;
            mCurrentNetworkType = 1;
        } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
            typeStr = getString(R.string.self_diagnosis_network_type_cell);
            isConnected = true;
            mCurrentNetworkType = 2;
        } else if (nc.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {
            typeStr = getString(R.string.self_diagnosis_network_type_ether);
            isConnected = true;
            mCurrentNetworkType = 3;
        }
    }
    return mCurrentNetworkType;
}

2. 网络连接强度

java 复制代码
private int checkSignalStrengthBasedOnType() {
	int level = 0;
    if (mCurrentNetworkType == -1) {
        return level;
    }
    // WIFI
    if (mCurrentNetworkType == 1) {
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        WifiInfo info = wifiManager.getConnectionInfo();
        int level = WifiManager.calculateSignalLevel(info.getRssi(), 5); // 0-5
        return level;
    }
    // CELLULAR
    if (mCurrentNetworkType == 2) {
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        try {
            SignalStrength ss = tm.getSignalStrength();
            if (ss != null) {
                int level = ss.getLevel(); // 0-4
                return level;
            }
        } catch (SecurityException e) {false);
        }
    }
    // ETHERNET or other
    return level;
}

3. 移动网络类型

java 复制代码
private boolean is5GNetworkType() {
	TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
	int actualDataNetworkType = mTelephonyManager.getDataNetworkType();
	if (actualDataNetworkType == TelephonyManager.NETWORK_TYPE_NR) {
		return true;
	}
	return false;

TelephonyManager 中定义的网络类型如下:

java 复制代码
private static final @NetworkType int[] NETWORK_TYPES = {
        NETWORK_TYPE_GPRS,
        NETWORK_TYPE_EDGE,
        NETWORK_TYPE_UMTS,
        NETWORK_TYPE_CDMA,
        NETWORK_TYPE_EVDO_0,
        NETWORK_TYPE_EVDO_A,
        NETWORK_TYPE_1xRTT,
        NETWORK_TYPE_HSDPA,
        NETWORK_TYPE_HSUPA,
        NETWORK_TYPE_HSPA,
        NETWORK_TYPE_IDEN,
        NETWORK_TYPE_EVDO_B,
        NETWORK_TYPE_LTE,
        NETWORK_TYPE_EHRPD,
        NETWORK_TYPE_HSPAP,
        NETWORK_TYPE_GSM,
        NETWORK_TYPE_TD_SCDMA,
        NETWORK_TYPE_IWLAN,
        NETWORK_TYPE_LTE_CA,
        NETWORK_TYPE_NR
};

4. 设备SN号

java 复制代码
public String getSn() {
    String sn = Build.getSerial();
    return TextUtils.isEmpty(sn) ? UNKNOWN : sn;
}

5. 设备电量

java 复制代码
public int getDevicePower() {
	BatteryManager mBatteryManager = (BatteryManager) getSystemService(Context.BATTERY_SERVICE);
    int batteryLevel = 0;
    if (mBatteryManager != null) {
        batteryLevel = mBatteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
    }
    return batteryLevel; 
}

6. 开机时长

java 复制代码
public int getDeviceOnDuration() {
    return (int) (SystemClock.elapsedRealtime() / 1000 / 60); // 单位为分钟
}

7. 设备IP地址

java 复制代码
public String getWanip() {
	ConnectivityManager mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    LinkProperties prop = mConnectivityManager.getLinkProperties(mConnectivityManager.getActiveNetwork());
    if (prop == null) return UNKNOWN;
    for (LinkAddress linkAddress : prop.getAllLinkAddresses()) {
        InetAddress address = linkAddress.getAddress();
        if (address instanceof Inet4Address && !address.isLoopbackAddress()) {
            return address.getHostAddress();
        }
    }
    return UNKNOWN;
}
相关推荐
limuyang23 小时前
PDF Viewer KMP(基于 chrome 的 PDFium 内核)
android·kotlin
心平气和量大福大7 小时前
android-控件-搜索框SearchView
android·gitee
2601_962177137 小时前
【MySQL篇】聚合查询,联合查询
android·java·mysql
壮哥_icon7 小时前
【Android】批量 VectorDrawable 动态分别修改 fillColor 和 strokeColor 的踩坑与终极解决方案
android
齐天qaq8 小时前
Android 系统 APK 分区与权限
android
心平气和量大福大9 小时前
android-控件-多选框CheckBox
android·gitee
pengyu10 小时前
【Kotlin 协程修仙录 · 大乘境 · 初阶】 | 跳出三界:协程在 KMP 与后端开发中的跨平台之道
android·kotlin
XiaoLeisj10 小时前
Android Memory Profiler:堆内存指标、内存抖动与泄漏定位
android·性能优化·内存抖动·内存泄露·memory profiler
未来猫咪花10 小时前
Everything is ViewModel:让状态管理回到对象世界
android·flutter·ios