Android 13中使用Apache Commons Net FTP遇EPERM权限问题求助
解决Android 13下FTPClient.connect()报EPERM权限错误的问题
针对你遇到的java.net.SocketException: socket failed: EPERM (Operation not permitted)错误,结合Android 13的系统特性,按以下步骤排查解决:
1. 确认清单权限配置位置
确保你添加的权限放在<manifest>根标签下,而非<application>标签内部,正确格式如下:
<manifest ...> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application ...> <!-- 你的应用组件配置 --> </application> </manifest>
2. 允许明文FTP流量(关键)
Android 9及以上版本默认禁止明文网络流量(非HTTPS/FTPS),标准FTP属于明文协议。需在<application>标签中添加如下配置:
<application ... android:usesCleartextTraffic="true"> ... </application>
若你的FTP服务器支持FTPS(加密FTP),建议优先使用FTPClient的SSL/TLS连接方式,避免依赖明文流量配置。
3. 避免在主线程执行网络操作
Android从3.0开始严格禁止在主线程发起网络请求,即使权限配置正确,主线程执行ftp.connect()也可能触发异常(部分场景会包装为权限类错误)。需将FTP连接逻辑放到子线程,以下是Kotlin协程的实现示例:
lifecycleScope.launch(Dispatchers.IO) { val ftp = FTPClient() try { ftp.connect(localAddress, port) Log.w("FTP", "connected") } catch (e: Exception) { e.printStackTrace() } }
4. 检查系统层面的网络限制
进入设备设置 > 应用 > 你的应用 > 流量使用情况,确认:
- 未开启「限制后台数据」
- 未勾选「禁止应用联网」(部分定制ROM提供该选项)
内容的提问来源于stack exchange,提问作者paolov
相关产品推荐
相关产品推荐

