在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;
}