【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;
}
相关推荐
csj506 小时前
安卓基础之《(26)—回到桌面与切到任务列表》
android
Grackers6 小时前
Android Perfetto 系列 7:MainThread 和 RenderThread 解读
android
whatever who cares7 小时前
java/android中单例模式详解
android·java
草莓熊Lotso7 小时前
【Linux系统加餐】 mmap 文件映射全解:从底层原理、API 到实战开发(含 malloc 模拟实现)
android·linux·运维·服务器·c语言·c++
peakmain97 小时前
CmComposeUI——基于 Kotlin Multiplatform Compose 的 UI 组件库
android
LcGero7 小时前
Cocos Creator 业务与原生通信详解
android·ios·cocos creator·游戏开发·jsb
fundoit7 小时前
MySQL插入数据遇到唯一键已存在怎么办?
android·数据库·mysql
ameyume7 小时前
基于原生Android 16设置音量调用流程
android·audio
ii_best7 小时前
lua语言开发脚本基础、mql命令库开发、安卓/ios基础开发教程,按键精灵新手工具
android·ios·自动化·编辑器
simpleeeeee7 小时前
Android 17 开发者指南:新 API、重大变更以及现在应该迁移的内容
android