我正在导入 apache commons net ftp 客户端
import org.apache.commons.net.ftp.FTP
import org.apache.commons.net.ftp.FTPClient
我尝试执行 ftp.connect() 函数
val ftp = FTPClient()
ftp.connect(localAddress, port)
Log.w("FTP", "connected")
ftp.connect()
会导致长堆栈跟踪异常。
但主要是这一行似乎是问题所在:
Caused by: java.net.SocketException: socket failed: EPERM (Operation not permitted)
所以我已添加到我的清单中:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
但错误仍然存在。
我已阅读这些权限的文档:
https://developer.android.com/develop/connectivity/network-ops/connecting
似乎我已经完成了所有需要做的事情,但我仍然不断收到 EPERM 操作不允许的错误。
任何帮助和指导将不胜感激,我对此很陌生,所以也许我错过了一些简单的东西。
我的应用目标设备运行的是 Android 13。
在我看来,该解决方案取决于以下几点:
将适当的使用权限放入清单中。无需在运行时询问。
确保服务器端有可用的侦听器。
Android 要求 ftp.connect 在与主线程分开的单独线程上运行。对我来说以下工作有效:
suspend fun networkReq() =
withContext(Dispatchers.IO) {
val ftp = FTPClient()
try {
ftp.connect(server_ip, server_port)
} catch (e: Exception) {
e.printStackTrace()
}
Log.w("FTP", "connected")
}
lifecycleScope.launch {
launch {
networkReq()
}
}