我已经为 Android 10 编写了 Wi-Fi 连接功能。它适用于 Android 10 版本的手机。它连接了各自的Wi-Fi,但在成功连接Wi-Fi之后。它失去了互联网的访问权限。
我的应用程序要求是以编程方式连接 Wi-Fi 和互联网访问。所以,请帮我找到解决方案。
我的功能如下,
public static void connectToWiFi(final Context cntx, String ssid, String key) {
int securityType = 1;
int highestPriorityNumber = 0;
WifiConfiguration selectedConfig = null;
mainWifiObj = (WifiManager) cntx.getSystemService(Context.WIFI_SERVICE);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
{
System.out.println("Wi-Fi Status: "+ mainWifiObj.isWifiEnabled());
if (!mainWifiObj.isWifiEnabled()) {
returnWifConnection("1234", "enableWifi");
}
}else{
if (!mainWifiObj.isWifiEnabled()) {
mainWifiObj.setWifiEnabled(true);
System.out.println("Wifi is enabled");
}
}
/* Check if not connected but has connected to that wifi in the past */
for (WifiConfiguration config : mainWifiObj.getConfiguredNetworks()) {
if (config.priority > highestPriorityNumber) highestPriorityNumber = config.priority;
if (config.SSID.equals(quoted(ssid)) && config.allowedKeyManagement.get(securityType)) {
System.out.println("Saved preshared key is " + config.preSharedKey);
if (securityType == WifiConfiguration.KeyMgmt.WPA_PSK
&& config.preSharedKey != null && config.preSharedKey.equals(key))
selectedConfig = config;
else if (securityType == WifiConfiguration.KeyMgmt.NONE)
selectedConfig = config;
}
}
if (selectedConfig != null) {
selectedConfig.priority = highestPriorityNumber + 1;
mainWifiObj.updateNetwork(selectedConfig);
// mainWifiObj.disconnect(); /* disconnect from whichever wifi you're connected to */
WifiInfo wifiInfo = mainWifiObj.getConnectionInfo();
String str = wifiInfo.getSSID().replace("\"", "");
System.out.print("wifiInfo.getSSID()1: " +str);
if(str.equals(ssid)){
// mainWifiObj.disconnect();
// mainWifiObj.setWifiEnabled(false);
isSameWifi = true;
System.out.print("\nSSID is same1");
}else{
isSameWifi = false;
System.out.print("\nSSID is different1");
}
mainWifiObj.enableNetwork(selectedConfig.networkId, true);
mainWifiObj.reconnect();
System.out.println("Connection exists in past, enabling and connecting priority = " + highestPriorityNumber);
}
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
{
WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder();
builder.setSsid(ssid);
builder.setWpa2Passphrase(key);
WifiNetworkSpecifier wifiNetworkSpecifier = builder.build();
NetworkRequest.Builder networkRequestBuilder1 = new NetworkRequest.Builder();
networkRequestBuilder1.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
networkRequestBuilder1.setNetworkSpecifier(wifiNetworkSpecifier);
NetworkRequest nr = networkRequestBuilder1.build();
System.out.println("Android sdk version is 29 above NetworkRequest");
final ConnectivityManager cm = (ConnectivityManager)
cntx.getSystemService(Context.CONNECTIVITY_SERVICE);
System.out.println("Android sdk version is 29 above ConnectivityManager");
ConnectivityManager.NetworkCallback networkCallback = new
ConnectivityManager.NetworkCallback()
{
@Override
public void onAvailable(Network network)
{
super.onAvailable(network);
System.out.println("onAvailabile" + network);
cm.bindProcessToNetwork(network);
}
@Override
public void onLosing(@NonNull Network network, int maxMsToLive)
{
super.onLosing(network, maxMsToLive);
System.out.println("onLosing" + network);
}
@Override
public void onLost(@NonNull Network network)
{
super.onLost(network);
System.out.println("onLost" + network);
}
@Override
public void onUnavailable()
{
super.onUnavailable();
System.out.println("onUnavaliable");
}
};
System.out.println("Android sdk version is 29 above NetworkCallback");
cm.requestNetwork(nr, networkCallback);
}
else
{
/* Make new connection */
WifiConfiguration config = new WifiConfiguration();
config.SSID = quoted(ssid);
config.priority = highestPriorityNumber + 1;
config.status = WifiConfiguration.Status.ENABLED;
if (securityType == WifiConfiguration.KeyMgmt.WPA_PSK) {
config.preSharedKey = quoted(key);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
}else {
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
}
System.out.println("Attempting new wifi connection, setting priority number to, connecting " + config.priority);
int netId = mainWifiObj.addNetwork(config);
// mainWifiObj.disconnect(); /* disconnect from whichever wifi you're connected to */
ConnectivityManager connManager = (ConnectivityManager) cntx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWifi.isConnected()) { /* Check for all networks are forget in mobile. */
WifiInfo wifiInfo = mainWifiObj.getConnectionInfo();
String str = wifiInfo.getSSID().replace("\"", "");
System.out.print("wifiInfo.getSSID(): " +str);
if(str.equals(ssid)){
// mainWifiObj.disconnect();
// mainWifiObj.setWifiEnabled(false);
isSameWifi = true;
System.out.print("\nSSID is same");
}else{
isSameWifi = false;
System.out.print("\nSSID is different");
}
}
mainWifiObj.enableNetwork(netId, true);
boolean isConnect = mainWifiObj.reconnect(); // todo?
System.out.println("Is Connect -> " + isConnect);
}
}