在 Android 平台上,java.net.SocketException: socket failed: EPERM (Operation not permitted)
错误可能是因为你的应用程序没有足够的权限来访问网络。要解决这个问题,你需要在你的 AndroidManifest.xml
文件中添加以下权限声明:
<uses-permission android:name="android.permission.INTERNET" />
这个权限允许你的应用程序使用网络套接字来发送和接收数据。
请注意,如果你在 Android 10 (API level 29) 或更高版本上运行应用程序,并且你想在后台使用网络,可能还需要添加以下权限声明:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
这两个权限允许你的应用程序检查网络状态和 Wi-Fi 状态。
如果你使用的是 Android Studio,你可以在 AndroidManifest.xml
文件中添加这些权限,或者在你的模块的 build.gradle
文件中添加以下代码:
android {
//...
defaultConfig {
//...
uses-permission 'android.permission.INTERNET'
uses-permission 'android.permission.ACCESS_NETWORK_STATE'
uses-permission 'android.permission.ACCESS_WIFI_STATE'
}
}
这将自动在 AndroidManifest.xml
文件中添加所需的权限声明。
请记住,在 Android 6.0 (API level 23) 或更高版本上,用户需要在运行时授予这些权限。你可以使用 ContextCompat.checkSelfPermission()
和 ActivityCompat.requestPermissions()
方法来请求和检查权限。例如:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET)!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.INTERNET), 0)
} else {
// 已经有权限,可以使用网络套接字
}
这段代码检查应用程序是否已经有了 Manifest.permission.INTERNET
权限,如果没有,就请求该权限。