Flutter Android应用连接服务器失败,报错SocketException权限被拒
解决方案:Flutter Android应用Socket权限拒绝(Errno 13)问题
针对你遇到的SocketException: Connection failed (OS Error: Permission denied, errno = 13)问题,即使添加了INTERNET权限仍无法连接,按以下步骤排查修复:
1. 确认权限放置位置正确
确保INTERNET权限声明在<manifest>标签内、<application>标签之外,错误的位置会导致权限不生效:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.your_app"> <!-- 权限必须放在此处 --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application android:label="Your App" android:icon="@mipmap/ic_launcher"> <!-- 应用内容配置 --> </application> </manifest>
2. 允许明文网络流量(Android 10+)
如果你的服务器使用HTTP而非HTTPS,Android 10(API 29)及以上系统默认禁止明文流量,需在<application>标签中添加配置:
<application android:usesCleartextTraffic="true" <!-- 其他原有配置 --> > ... </application>
3. 强制保留权限(针对App Bundle构建)
若使用Android App Bundle(AAB)发布,Google Play可能自动剥离未被代码直接调用的权限,需添加tools:node="merge"强制保留:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" <!-- 新增tools命名空间 --> package="com.example.your_app"> <uses-permission android:name="android.permission.INTERNET" tools:node="merge"/> ... </manifest>
4. 清理缓存并重新构建
项目缓存可能导致权限配置不生效,执行以下操作:
- 运行终端命令:
flutter clean - 删除
android/app/build目录下的所有文件 - 重启开发工具(Android Studio/VS Code)
- 重新运行
flutter run
5. 修复IP输入框的键盘类型
当前IP输入框的keyboardType为TextInputType.number,无法输入小数点,会导致用户输入无效IP地址(间接引发连接问题),修改为:
TextFormField( controller: _ipController, keyboardType: TextInputType.numberWithOptions(decimal: true), // 允许输入小数点 decoration: InputDecoration( hintText: 'Enter IP Address', ), ),
内容的提问来源于stack exchange,提问作者Adeleh Poursadegh
相关产品推荐
相关产品推荐

