当前位置: 首页 > news >正文

uni-app在安卓设备上获取 (WIFI 【和】以太网) ip 和 MAC

 示例标题:题主以下用于 Android 版本 7.1.2

一、获取( WIFI 【和】 以太网 ) IP

<template><view class="UserQuerise"></view>
</template><script>export default {data() {return {wifiIp: '', // (WIFI)--IPethernetIp: '', // (以太网)--IP}},onload() {// Ip地址 (WIFI和 以太网)this.getDeviceIpAddresses()},methods: {// 获取设备Ip地址  (WIFI 和 以太网)getDeviceIpAddresses() {if (typeof plus === 'undefined' || plus.os.name !== 'Android') {console.log('非安卓环境,无法获取IP');return;}try {// 导入安卓原生类const Context = plus.android.importClass('android.content.Context');const ConnectivityManager = plus.android.importClass('android.net.ConnectivityManager');const WifiManager = plus.android.importClass('android.net.wifi.WifiManager');const NetworkInterface = plus.android.importClass('java.net.NetworkInterface');const InetAddress = plus.android.importClass('java.net.InetAddress');// 获取系统服务const mainActivity = plus.android.runtimeMainActivity();const connectivityManager = mainActivity.getSystemService(Context.CONNECTIVITY_SERVICE);// 1. WiFi IP获取逻辑const wifiManager = mainActivity.getSystemService(Context.WIFI_SERVICE);const wifiInfo = plus.android.invoke(wifiManager, "getConnectionInfo");if (wifiInfo) {const wifiIpInt = plus.android.invoke(wifiInfo, "getIpAddress");if (wifiIpInt !== 0) {this.wifiIp = this.intToIp(wifiIpInt);}} else {console.log('未获取到WiFi连接信息');}// 2. 有线(以太网)IP获取逻辑(适配Android 7.1.2)try {// 获取所有网络接口const interfaces = NetworkInterface.getNetworkInterfaces();// 使用plus.android.invoke调用Java方法while (plus.android.invoke(interfaces, "hasMoreElements")) {const intf = plus.android.invoke(interfaces, "nextElement");// 跳过回环接口if (plus.android.invoke(intf, "isLoopback")) continue;const interfaceName = plus.android.invoke(intf, "getName");// console.log("检查接口:", interfaceName);if (interfaceName.startsWith("eth") || interfaceName.startsWith("usb")) {const addresses = plus.android.invoke(intf, "getInetAddresses");while (plus.android.invoke(addresses, "hasMoreElements")) {const addr = plus.android.invoke(addresses, "nextElement");if (!plus.android.invoke(addr, "isLoopbackAddress")) {const hostAddress = plus.android.invoke(addr, "getHostAddress");if (hostAddress.indexOf(':') === -1) {this.ethernetIp = hostAddress;// console.log("找到以太网IP:", this.ethernetIp);break;}}}}}} catch (e) {console.error("获取网络接口时出错:", e);}console.log('WiFi IP:', this.wifiIp);console.log('有线(以太网)IP:', this.ethernetIp);} catch (e) {console.error('获取IP失败:', e);}},//辅助方法 : 将整数Ip转换为字符串intToIp(ipInt) {return ((ipInt & 0xFF) +'.' +((ipInt >> 8) & 0xFF) +'.' +((ipInt >> 16) & 0xFF) +'.' +((ipInt >> 24) & 0xFF));},}}
</script><style></style>

二、获取( WIFI 【和】 以太网 ) MAC

<template><view class="UserQuerise"></view>
</template><script>export default {data() {return {wifiMac: '', // (WIFI)--MACethernetMac: '' // (以太网)--MAC}},onload() {// MAC地址 (WIFI和 以太网)this.getDeviceMacAddresses()},methods: {// 获取设备MAC地址  (WIFI 和 以太网)getDeviceMacAddresses() {if (typeof plus === 'undefined' || plus.os.name !== 'Android') {console.log('非安卓环境,无法获取MAC地址');return;}try {// 重置结果this.wifiMac = '';this.ethernetMac = '';// 导入必要的Android类const NetworkInterface = plus.android.importClass('java.net.NetworkInterface');const File = plus.android.importClass('java.io.File');const FileReader = plus.android.importClass('java.io.FileReader');const BufferedReader = plus.android.importClass('java.io.BufferedReader');// --------------------------// 方法1:通过NetworkInterface遍历所有接口(优先使用)// --------------------------// console.log('尝试通过NetworkInterface获取MAC地址...');try {const interfaces = plus.android.invoke(NetworkInterface, "getNetworkInterfaces");while (interfaces && plus.android.invoke(interfaces, "hasMoreElements")) {const intf = plus.android.invoke(interfaces, "nextElement");const interfaceName = plus.android.invoke(intf, "getName");const isUp = plus.android.invoke(intf, "isUp");const isLoopback = plus.android.invoke(intf, "isLoopback");console.log(`检查接口: ${interfaceName}, isUp=${isUp}, isLoopback=${isLoopback}`);// 跳过回环接口和未激活的接口if (isLoopback || !isUp) continue;// 尝试获取MAC字节const macBytes = plus.android.invoke(intf, "getHardwareAddress");// 检查MAC是否有效(非空且长度为6字节)if (macBytes && macBytes.length === 6) {const macAddress = this.bytesToMac(macBytes);console.log(`接口${interfaceName}的MAC: ${macAddress}`);// 区分WiFi和以太网接口if (interfaceName.startsWith("wlan")) {this.wifiMac = macAddress;console.log('找到WiFi MAC:', this.wifiMac);} else if (interfaceName.startsWith("eth") || interfaceName.startsWith("usb")) {this.ethernetMac = macAddress;console.log('找到以太网MAC:', this.ethernetMac);}}}} catch (e) {console.error('通过NetworkInterface获取MAC失败:', e);}// --------------------------// 方法2:通过系统文件获取MAC(备用方案)// --------------------------if (!this.wifiMac || !this.ethernetMac) {// console.log('尝试通过系统文件获取MAC地址...');try {const netDir = new File("/sys/class/net/");const interfaces = netDir.list();if (interfaces) {for (let i = 0; i < interfaces.length; i++) {const interfaceName = interfaces[i];const addressFile = new File(netDir, `${interfaceName}/address`);if (addressFile.exists()) {try {const reader = new BufferedReader(new FileReader(addressFile));const macAddress = reader.readLine().trim();reader.close();// 验证MAC格式(正则表达式)if (/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/.test(macAddress)) {// console.log(`系统文件中找到${interfaceName}的MAC: ${macAddress}`);if (interfaceName.startsWith("wlan")) {this.wifiMac = macAddress;} else if (interfaceName.startsWith("eth") || interfaceName.startsWith("usb")) {this.ethernetMac = macAddress;}}} catch (e) {console.error(`读取${interfaceName}的MAC文件失败:`, e);}}}}} catch (e) {console.error('通过系统文件获取MAC失败:', e);}}// --------------------------// 输出最终结果// --------------------------console.log('WiFi MAC:', this.wifiMac || '未获取到');console.log('以太网MAC:', this.ethernetMac || '未获取到');// 如果仍未获取到,尝试使用备用接口名称if (!this.ethernetMac) {console.log('尝试备用接口名称...');// 这里可以添加针对特定设备的接口名称匹配逻辑}} catch (e) {console.error('获取MAC地址失败:', e);}},// 辅助方法:将字节数组转换为MAC地址格式bytesToMac(bytes) {try {// 确保是有效的字节数组if (!bytes || bytes.length !== 6) return null;// 转换为十六进制字符串const hex = [];for (let i = 0; i < bytes.length; i++) {// 处理Java字节的有符号问题const byte = bytes[i] & 0xff;hex.push(byte.toString(16).padStart(2, '0').toUpperCase());}return hex.join(':');} catch (e) {console.error('字节转MAC失败:', e);return null;}},}}
</script><style></style>

http://www.xdnf.cn/news/1123075.html

相关文章:

  • C语言-数据输入与输出
  • java学习 day4 分布式锁
  • 【Learning Notes】 Derak Callan‘s Business English P38~40
  • 【【异世界历险之数据结构世界(二叉树)】】
  • Why C# and .NET are still relevant in 2025
  • 安装Keycloak并启动服务(macOS)
  • 4.2TCP/IP
  • USB读写自动化压力测试
  • 小波变换 | 离散小波变换
  • AI驱动的软件工程(下):AI辅助的质检与交付
  • FreeRTOS之链表操作相关接口
  • 人工智能如何重构能源系统以应对气候变化?
  • 29.安卓逆向2-frida hook技术-逆向os文件(二)IDA工具下载和使用
  • kali安装失败-选择并安装软件包-一步到位
  • 7.15 窗口函数 | 二分 | 位运算 | 字符串dp
  • C# TCP粘包与拆包深度了解
  • MCP基础知识二(实战通信方式之Streamable HTTP)
  • 微信131~140
  • 属性绑定
  • 零基础 “入坑” Java--- 十一、多态
  • IDEA中使用Servlet,tomcat输出中文乱码
  • 《星盘接口2:NVMe风暴》
  • [spring6: Resource ResourceLoader ResourceEditor]-加载资源
  • 【Java笔记】七大排序
  • 现有医疗AI记忆、规划与工具使用的创新路径分析
  • 融合竞争学习与高斯扰动的多目标加权平均算法(MOWAA)求解多无人机协同路径规划(多起点多终点,起始点、无人机数、障碍物可自定义),提供完整MATLAB代码
  • 嵌入式硬件篇---晶体管的分类
  • Transformer江湖录 第五章:江湖争锋 - BERT vs GPT
  • ZYNQ双核通信终极指南:FreeRTOS移植+OpenAMP双核通信+固化实战
  • CSS面试题