android - 以编程方式连接到它时 Wifi Internet 无法正常工作 android>=10
问题描述
我正在尝试在 android 中以编程方式连接到 Wifi,但问题是 wifi 正在连接,但互联网无法正常工作,虽然 wifi 有互联网但在应用程序上它不工作。当我尝试添加 NET_CAP_INTERNET 时,它会捕获块而不是连接到 wifi。我有oneplus手机,在其他一些手机中我也面临这个问题。我也尝试添加 NET_CAP_NO_RESTRICTION 但问题仍然存在。帮我解决这个问题。
同样对于低于 10 的 android,因为我们没有任何回调,所以我们怎么知道用户输入了错误的密码。就像当用户输入错误的密码时我们需要做一些事情一样。我们应该怎么做?
private void connectToWifi(String ssid, String password) {
WifiManager wifiManager = (WifiManager) getActivity().getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
try {
WifiConfiguration wifiConfig = new WifiConfiguration();
wifiConfig.SSID = "\"" + ssid + "\"";
wifiConfig.preSharedKey = "\"" + password + "\"";
int netId = wifiManager.addNetwork(wifiConfig);
wifiManager.enableNetwork(netId, true);
if(checkWithCurrentConnectedWifi(ssid))
navController.navigate(R.id.configureWififragment);
else
{
enterSsidPassManually();
Toast.makeText(getActivity(), R.string.wrongCredentials, Toast.LENGTH_SHORT).show();
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getActivity(),
R.string.wifi_connection_error,
Toast.LENGTH_SHORT).show();
count++;
}
} else {
try {
WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.setWpa2Passphrase(password)
.build();
NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(wifiNetworkSpecifier)
.build();
ConnectivityManager connectivityManager = (ConnectivityManager) getActivity().getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
connectivityManager.bindProcessToNetwork(network);
} else {
ConnectivityManager.setProcessDefaultNetwork(network);
}
if(checkWithCurrentConnectedWifi(ssid))
navController.navigate(R.id.configureWififragment);
else
{
Toast.makeText(getActivity(), R.string.notGatewayWifi, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onLosing(@NonNull Network network, int maxMsToLive) {
//Toast.makeText(getActivity(), "on Losing", Toast.LENGTH_SHORT).show();
super.onLosing(network, maxMsToLive);
}
@Override
public void onLost(Network network) {
//Toast.makeText(getActivity(), "onLost", Toast.LENGTH_SHORT).show();
super.onLost(network);
}
@Override
public void onUnavailable() {
super.onUnavailable();
}
};
connectivityManager.requestNetwork(networkRequest, networkCallback);
} catch (Exception e) {
Toast.makeText(getActivity(),R.string.wifi_connection_error,Toast.LENGTH_SHORT).show();
count++;
}
}
}
解决方案
推荐阅读
- python - pip 安装我的包,但我无法导入它 Python 3.10
- javascript - 使用手动递归 setTimeout 而不是 @Interval 在 NestJS 中调度重复发生的任务
- typescript - 如何在 TypeScript 中遍历递归生成器?
- javascript - 由于 SSL 错误,Android Webview 应用程序无法在 HTTPS 上显示任何内容
- sql - DBeaver SQL 是否有恢复查询的选项?
- python - Python没有从任何包播放音频
- amazon-web-services - 通过 AWS VPN Client(不在 VPC 网络上)访问非集群 Redis elasticache
- spring-boot - 为什么 Sping Boot 原生查询返回 null?
- python - How to define method in python that takes the class type as a parameter?
- asp.net-core - AddSingleton 是否保证只在 asp.net 核心中的工厂运行一次?