【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;
}
相关推荐
树獭非懒1 小时前
告别繁琐多端开发:DivKit 带你玩转 Server-Driven UI!
android·前端·人工智能
三少爷的鞋2 小时前
为什么应该先在 IntelliJ 中学习 Kotlin 与协程,而不是直接上 Android Studio
android
不爱说话郭德纲17 小时前
告别漫长的HbuilderX云打包排队!uni-app x 安卓本地打包保姆级教程(附白屏、包体积过大排坑指南)
android·前端·uni-app
Sinclair21 小时前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
雮尘1 天前
手把手带你玩转Android gRPC:一篇搞定原理、配置与客户端开发
android·前端·grpc
ktl1 天前
Android 编译加速/优化 80%:一个文件搞定,零侵入零配置
android
alexhilton2 天前
使用FunctionGemma进行设备端函数调用
android·kotlin·android jetpack
冬奇Lab2 天前
InputManagerService:输入事件分发与ANR机制
android·源码阅读
张小潇2 天前
AOSP15 Input专题InputManager源码分析
android·操作系统
RdoZam2 天前
Android-封装基类Activity\Fragment,从0到1记录
android·kotlin