分享一下鸿蒙获取设备信息的方法(下篇)
获取网络类型
声明接口调用所需要的权限:ohos.permission.GET_NETWORK_INFO
常见错误
1
写错文件
a
src/ohosTest/module.json5 ❌
b
src/main/module.json5 ✅
2
写错权限
a
ohos.permission.INTERNET ❌
b
ohos.permission.GET_NETWORK_INFO ✅
{
"module": {
"requestPermissions": [
{
// 允许应用获取数据网络信息
"name": "ohos.permission.GET_NETWORK_INFO"
}
],
}
}
检查是否有默认连接的网络
// 获取网络类型
getConnection() {
// 检测是否有默认连接的网络
const hasDefaultNet = connection.hasDefaultNetSync()
// 没有网络
if (!hasDefaultNet) {
this.netWorkType = '无网络'
} else {
this.netWorkType = '有网络'
}
}
注意:检测是否有默认连接的网络,需要添加权限,忘记开启权限编辑器中会有警告。
有网络获取网络类型
// 获取网络类型
getConnection() {
// 检测是否有默认连接的网络
const hasDefaultNet = connection.hasDefaultNetSync()
// 没有网络
if (!hasDefaultNet) {
this.netWorkType = '无网络'
} else {
// this.netWorkType = '有网络'
// 获取网络类型
this.getConnectionNetBearType()
}
}
// 获取网络类型
getConnectionNetBearType() {
// 有网络的情况下,获取默认激活的数据网络
const defaultNet = connection.getDefaultNetSync()
// 获取网络类型
const netCapabilities = connection.getNetCapabilitiesSync(defaultNet)
// 查询网络类型
if (netCapabilities.bearerTypes.includes(connection.NetBearType.BEARER_WIFI)) {
this.netBearType = 'WIFI网络'
} else if (netCapabilities.bearerTypes.includes(connection.NetBearType.BEARER_CELLULAR)) {
this.netBearType = '蜂窝网络'
} else if (netCapabilities.bearerTypes.includes(connection.NetBearType.BEARER_ETHERNET)) {
// 温馨提示:模拟器为以太网网络(网线)
this.netBearType = '以太网网络'
}
}
获取IP地址
// 获取网络类型
getConnection() {
// 检测是否有默认连接的网络
const hasDefaultNet = connection.hasDefaultNetSync()
// 没有网络
if (!hasDefaultNet) {
this.netWorkType = '无网络'
} else {
// 获取网络类型
this.getConnectionNetBearType()
// 获取链路信息
this.getConnectionProperties()
}
}
// 获取链路信息
getConnectionProperties() {
// 获取默认网络
const netHandle = connection.getDefaultNetSync()
// 获取默认网络的链路信息
const connectionProperties = connection.getConnectionPropertiesSync(netHandle)
// 提取链路信息
const linkAddress = connectionProperties.linkAddresses[0]
if (linkAddress) {
// 获取 IP 地址
this.IPAddress = linkAddress.address.address
}
}
补充
计算机子网掩码、计算广播地址
/**
* 计算子网掩码
* @param prefixLength 前缀长度
* @returns 子网掩码字符串
*/
function calculateSubnetMask(prefixLength: number): string {
// 计算每个字节的子网掩码部分
let subnetMask = '';
for (let i = 0; i < 4; i++) {
// 每个字节中的有效位数
const bits = Math.min(prefixLength, 8);
// 计算子网掩码字节的值并添加到结果字符串
subnetMask += (256 - Math.pow(2, 8 - bits)) + '.';
// 更新剩余的位数
prefixLength -= bits;
}
// 去除末尾的点并返回子网掩码字符串
return subnetMask.slice(0, -1);
}
/**
* 计算广播地址
* @param ipAddress IP地址字符串,例如 "192.168.2.13"
* @param subnetMask 子网掩码字符串,例如 "255.255.255.0"
* @returns 广播地址字符串
*/
function calculateBroadcastAddress(ipAddress: string, subnetMask: string): string {
// 将IP地址字符串转换为数字数组
const ipParts: number[] = ipAddress.split('.')
.map(Number);
// 将子网掩码字符串转换为数字数组
const subnetParts: number[] = subnetMask.split('.')
.map(Number);
// 计算每个字节的广播地址部分
const broadcastParts: number[] = [];
for (let i = 0; i < 4; i++) {
// 计算每个字节的广播地址值并添加到结果数组
broadcastParts.push(ipParts[i] | (255 - subnetParts[i]));
}
// 将结果数组转换为字符串并使用点分隔
return broadcastParts.join('.');
}
// 获取链路信息
getConnectionProperties() {
// 获取默认网络的链路信息
const connectionProperties = connection.getConnectionPropertiesSync(connection.getDefaultNetSync())
// 提取链路信息
const linkAddress = connectionProperties.linkAddresses[0]
if (linkAddress) {
// 获取 IP 地址
this.IPAddress = linkAddress.address.address
// 计算子网掩码
this.subnetMask = calculateSubnetMask(linkAddress.prefixLength)
// 计算广播地址
this.broadcastAddress = calculateBroadcastAddress(this.IPAddress, this.subnetMask)
}
}
获取屏幕分辨率
import { display } from '@kit.ArkUI'
// 屏幕分辨率(像素)
@State displayHeight: number = 0
@State displayWidth: number = 0
// 屏幕刷新率(Hz)
@State displayRefreshRate: number = 0
// 像素密度(PPI)
@State displayDensityDPI: number = 0
// 获取屏幕分辨率
getDisplayInfo() {
// 获取默认屏幕
const defaultDisplay = display.getDefaultDisplaySync()
// 屏幕分辨率(像素)
this.displayWidth = defaultDisplay.width
this.displayHeight = defaultDisplay.height
// 屏幕刷新率(HZ)
this.displayRefreshRate = defaultDisplay.refreshRate
// 像素密度(PPI)
this.displayDensityDPI = defaultDisplay.densityDPI
}