【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;
}
相关推荐
千里马学框架18 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台18 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone18 小时前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc19 小时前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo20 小时前
Kotlin 协程中的 Job 结构化并发与取消
android
sun00770021 小时前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
SDWAN_Cheap21 小时前
网络寻址详解:从IP地址到MAC地址再到端口号的完整过程
ip·端口·mac地址
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas