当前位置: 首页 > 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.lryc.cn/news/588059.html

相关文章:

  • 游戏设备软件加密锁复制:技术壁垒与安全博弈
  • 高安全前端架构:Rust-WASM 黑盒技术揭秘
  • 多云环境下的统一安全架构设计
  • 从 JSON 到 Python 对象:一次通透的序列化与反序列化之旅
  • Eplan API Creating projects or pages
  • .net winfrom 获取上传的Excel文件 单元格的背景色
  • 使⽤Pytorch构建⼀个神经⽹络
  • Solid Edge多项目并行,浮动许可如何高效调度?
  • 在项目中集成开源的表单设计器FcDesigner源码
  • mongodb原理及其实现
  • Context Tuning for In-Context Optimization
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(4):语法+单词+復習+发音
  • Nacos 技术研究文档(基于 Nacos 3)
  • Linux:1_Linux下基本指令
  • C++-linux 6.makefile和cmake
  • 多线程--单例模式and工厂模式
  • FreeRTOS之链表操作相关接口
  • QT——文件操作类 QFile和QTextStream
  • 第一次接触自动化监测,需要付费厂家安装服务吗?比人工测量主要区别是啥?
  • 用Python向PDF添加文本:精确插入文本到PDF文档
  • 2024-2025-2 山东大学《毛概》期末(回忆版)
  • 复习笔记 38
  • linux下的消息队列数据收发
  • “国乙黑月光”指的是谁?
  • 动态规划题解——单词拆分【LeetCode】
  • 【字节跳动】数据挖掘面试题0017:推荐算法:双塔模型,怎么把内容精准地推送给用户
  • 设计模式(行为型)-迭代器模式
  • iOS App 安全加固全流程:静态 + 动态混淆对抗逆向攻击实录
  • Linux进程优先级机制深度解析:从Nice值到实时调度
  • 基于MATLAB的LSTM长短期记忆神经网络的时间序列数据预测方法应用