【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;
}
相关推荐
HLC++10 小时前
Linux的进程间通信
android·linux·服务器
爱笑鱼14 小时前
Binder(二):AIDL 生成的 Proxy、Stub 和 Parcel 到底在做什么?
android
爱笑鱼14 小时前
Binder(一):一次方法调用,究竟怎样跨进程执行?
android
壮哥_icon15 小时前
【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)
android·运维·自动化
用户693717500138416 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端
蝉蜕日记17 小时前
AccumuPDF高级版 v2.57 | 视图文转换PDF,合并分割压缩
android·智能手机·pdf·生活·软件需求
吐了啊取名字太难17 小时前
美颜系统AI修图本地跑并支持Mac、win、安卓、iOS不卡顿
android·人工智能·windows·数码相机·mac·ai编程
阿pin18 小时前
Android随笔-Retrofit
android·retrofit
想取一个与众不同的名字好难18 小时前
安卓自定义颜色选择器
android
我命由我1234519 小时前
Android 开发问题:java.lang.NoSuchMethodError:No virtual method readAllBytes()
android·java·java-ee·kotlin·android studio·android-studio·android runtime