我的应用程序需要连接到接入点,连接后进行 http GET 以了解设备的版本。
与 AP 的连接工作良好。
什么时候进行 http 调用,我总是在构建 Android 11 或更高版本的手机上得到
check WS error: SocketException: Connection failed (OS Error: Network is unreachable, errno = 101), address = 192.168.4.1, port = 80
。
那是我的代码(如果连接失败,我必须重试 MAX_ATTEMPT 次):
Future<bool> checkWS() async {
try {
print("checkWS attempt #$attempt");
final uri = Uri.http("192.168.4.1", "xxxxxxxx.xxx");
print("GET $uri");
final response = await http.get(uri).timeout(const Duration(seconds: 5));
if (response.statusCode > 400) return false;
return !response.body.contains("913.3.");
} catch (e) {
print("check WS error: $e");
if (attempt < MAX_ATTEMPT) {
return await Future.delayed(const Duration(seconds: 1), () {
attempt++;
return checkWS();
});
} else {
throw TimeoutException(null);
}
}
}
这是我的
AndroidManifefest.xml
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="dsafadgadfgdwgfsd">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:label="xxxxxxx"
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config">
<!-- for http support-->
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
<activity
android:name=".MainActivity"
.....
network_security_config
:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">192.168.4.1</domain>
</domain-config>
</network-security-config>
如何让它在 A11+ 上运行?