NetworkInterface.getNetworkInterfaces() returns 空值 (android 29)
NetworkInterface.getNetworkInterfaces() returns null (android 29)
我运行下面connectAndroidQ代码连接打开ap,disconnectAndroidQ代码断开,但是连接断开后,NetworkInterface.getNetworkInterfaces()的return值为null .
在执行下面的代码之前,NetworkInterface.getNetworkInterfaces()的return值是正常的,只是运行将代码return设为空值。
测试phone:pixel2
android 版本:10
@RequiresApi(api = Build.VERSION_CODES.Q)
private boolean connectAndroidQ(@Nullable ConnectivityManager connectivityManager, ScanResult scanResult) {
if (connectivityManager == null) {
return false;
}
WifiNetworkSpecifier.Builder wifiNetworkSpecifierBuilder = new WifiNetworkSpecifier.Builder()
.setSsid(scanResult.SSID);
NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(wifiNetworkSpecifierBuilder.build())
.build();
if (networkCallback != null) {
connectivityManager.unregisterNetworkCallback(networkCallback);
}
networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
connectivityManager.bindProcessToNetwork(network);
}
@Override
public void onUnavailable() {
super.onUnavailable();
}
};
connectivityManager.requestNetwork(networkRequest, networkCallback);
return true;
}
@RequiresApi(api = Build.VERSION_CODES.Q)
private boolean disconnectAndroidQ(@NonNull final ConnectivityManager connectivityManager) {
if (networkCallback != null) {
connectivityManager.unregisterNetworkCallback(networkCallback);
networkCallback = null;
}
return true;
}
请帮忙。
提前致谢。
我通过调用 bindProcessToNetwork(null) 解决了这个问题。
参见下面的link,请注意,如果网络断开连接,以这种方式创建的所有套接字将停止工作,所有主机名解析都将失败。这是设计使然,因此应用程序不会意外使用它认为仍绑定到特定网络的套接字。为网络清除绑定传递 null。
我运行下面connectAndroidQ代码连接打开ap,disconnectAndroidQ代码断开,但是连接断开后,NetworkInterface.getNetworkInterfaces()的return值为null .
在执行下面的代码之前,NetworkInterface.getNetworkInterfaces()的return值是正常的,只是运行将代码return设为空值。
测试phone:pixel2 android 版本:10
@RequiresApi(api = Build.VERSION_CODES.Q)
private boolean connectAndroidQ(@Nullable ConnectivityManager connectivityManager, ScanResult scanResult) {
if (connectivityManager == null) {
return false;
}
WifiNetworkSpecifier.Builder wifiNetworkSpecifierBuilder = new WifiNetworkSpecifier.Builder()
.setSsid(scanResult.SSID);
NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(wifiNetworkSpecifierBuilder.build())
.build();
if (networkCallback != null) {
connectivityManager.unregisterNetworkCallback(networkCallback);
}
networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
connectivityManager.bindProcessToNetwork(network);
}
@Override
public void onUnavailable() {
super.onUnavailable();
}
};
connectivityManager.requestNetwork(networkRequest, networkCallback);
return true;
}
@RequiresApi(api = Build.VERSION_CODES.Q)
private boolean disconnectAndroidQ(@NonNull final ConnectivityManager connectivityManager) {
if (networkCallback != null) {
connectivityManager.unregisterNetworkCallback(networkCallback);
networkCallback = null;
}
return true;
}
请帮忙。
提前致谢。
我通过调用 bindProcessToNetwork(null) 解决了这个问题。
参见下面的link,请注意,如果网络断开连接,以这种方式创建的所有套接字将停止工作,所有主机名解析都将失败。这是设计使然,因此应用程序不会意外使用它认为仍绑定到特定网络的套接字。为网络清除绑定传递 null。