如何用Python结合Flet框架获取Android设备的网络IP
在Android设备上通过Flet/Python获取网络IP的解决方案
问题原因
Android系统默认将主机名映射到回环地址127.0.0.1,所以socket.gethostbyname(socket.gethostname())必然返回本地回环地址,无法获取实际网络IP。
解决方案
以下两种方法可在Android设备上获取有效网络IP,即使无互联网接入(只要设备连接了局域网/WiFi/热点):
方法1:使用原生socket+fcntl遍历网络接口
无需额外依赖,纯Python实现:
import socket import fcntl import struct import array def get_local_ip(): max_interfaces = 128 buffer_size = max_interfaces * 32 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 获取所有网络接口信息 name_buffer = array.array('B', b'\0' * buffer_size) result = fcntl.ioctl( sock.fileno(), 0x8912, # SIOCGIFCONF 指令 struct.pack('iL', buffer_size, name_buffer.buffer_info()[0]) ) actual_size = struct.unpack('iL', result)[0] interface_data = name_buffer.tobytes() # 解析接口数据,筛选有效IP for i in range(0, actual_size, 40): interface_name = interface_data[i:i+16].split(b'\0', 1)[0].decode() ip_address = socket.inet_ntoa(interface_data[i+20:i+24]) # 排除回环接口和无效地址 if ip_address != '127.0.0.1' and not interface_name.startswith(('lo', 'dummy')): return ip_address # 无有效IP时返回回环地址 return '127.0.0.1'
方法2:使用netifaces库(更简洁)
netifaces封装了网络接口操作,代码更易读:
- 先安装依赖:
pip install netifaces
- 实现代码:
import netifaces def get_local_ip(): # 遍历所有网络接口 for interface in netifaces.interfaces(): # 跳过回环接口 if interface == 'lo': continue # 获取接口的地址信息 addr_info = netifaces.ifaddresses(interface) # 提取IPv4地址 if netifaces.AF_INET in addr_info: for ip_details in addr_info[netifaces.AF_INET]: ip = ip_details['addr'] if ip != '127.0.0.1': return ip return '127.0.0.1'
注意事项
- 若设备未连接任何网络(无WiFi、无热点、无移动数据),则只能返回
127.0.0.1,因为此时设备不存在其他网络IP。 - 使用Flet打包Android应用时,需确保依赖库(如
netifaces)被正确包含在打包配置中。
内容的提问来源于stack exchange,提问作者Hossein Bahiraei
相关产品推荐
相关产品推荐

