问题描述
我对WiFi API的版本完全迷失了。 我想以编程方式连接到已配置的WiFi网络。 正如在这个问题中所述: Connect to wifi network Android programmatically
我在Android 10上进行开发,希望编写与旧版Android版本兼容的代码。
在我的android 10上,描述的代码不起作用。 在Android 10上实现该功能需要什么代码?
如何编写也可以在其他Android 9手机上运行的应用程序?
关于于尔根(Jürgen)
解决方法
这是从Android 6(API级别23)开始工作的解决方案
ctrl+a
,
从Android Q,连接到Wifi网络有很多变化。
首先,您正在使用的代码或提到的@matdev使用public int addNetwork (WifiConfiguration config)
中的API WifiManager
的API 1. WifiNetworkSpecifier
在Android 10中已弃用,并将返回-1作为networkID。
从Android Q开始,建议使用两个类进行Wifi连接。但是它们每个都有自己的优点和缺点。
WifiNetworkSpecifier.Builder wifiNetworkSpecifierBuilder = new WifiNetworkSpecifier.Builder()
.setSsid(scanResult.SSID)
.setBssid(MacAddress.fromString(scanResult.BSSID));
final String security = ConfigSecurities.getSecurity(scanResult);
ConfigSecurities.setupWifiNetworkSpecifierSecurities(wifiNetworkSpecifierBuilder,security,password);
NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(wifiNetworkSpecifierBuilder.build())
.build();
// not sure,if this is needed
if (networkCallback != null) {
connectivityManager.unregisterNetworkCallback(networkCallback);
}
networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
wifiLog("AndroidQ+ connected to wifi ");
// bind so all api calls are performed over this new network
connectivityManager.bindProcessToNetwork(network);
}
@Override
public void onUnavailable() {
super.onUnavailable();
wifiLog("AndroidQ+ could not connect to wifi");
}
};
connectivityManager.requestNetwork(networkRequest,networkCallback);
WifiUtil库中的代码示例
2. WifiNetworkSuggestion
我对该实现的观察是-它更像是P2P通信,并且此时来自同一设备的其他应用程序无法使用连接的WiFi网络的互联网
final WifiNetworkSuggestion suggestion1 =
new WifiNetworkSuggestion.Builder()
.setSsid("test111111")
.setIsAppInteractionRequired(true) // Optional (Needs location permission)
.build();
final WifiNetworkSuggestion suggestion2 =
new WifiNetworkSuggestion.Builder()
.setSsid("test222222")
.setWpa2Passphrase("test123456")
.setIsAppInteractionRequired(true) // Optional (Needs location permission)
.build();
final WifiNetworkSuggestion suggestion3 =
new WifiNetworkSuggestion.Builder()
.setSsid("test333333")
.setWpa3Passphrase("test6789")
.setIsAppInteractionRequired(true) // Optional (Needs location permission)
.build();
final PasspointConfiguration passpointConfig = new PasspointConfiguration();
// configure passpointConfig to include a valid Passpoint configuration
final WifiNetworkSuggestion suggestion4 =
new WifiNetworkSuggestion.Builder()
.setPasspointConfig(passpointConfig)
.setIsAppInteractionRequired(true) // Optional (Needs location permission)
.build();
final List<WifiNetworkSuggestion> suggestionsList =
new ArrayList<WifiNetworkSuggestion> {{
add(suggestion1);
add(suggestion2);
add(suggestion3);
add(suggestion4);
}};
final WifiManager wifiManager =
(WifiManager) context.getSystemService(Context.WIFI_SERVICE);
final int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
// do error handling here…
}
// Optional (Wait for post connection broadcast to one of your suggestions)
final IntentFilter intentFilter =
new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION);
final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context,Intent intent) {
if (!intent.getAction().equals(
WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) {
return;
}
// do post connect processing here...
}
};
context.registerReceiver(broadcastReceiver,intentFilter);
developer.android.com中的代码示例
wifiManager.addNetworkSuggestions
我对上述实现的观察是,当您调用wifiManager.addNetworkSuggestions
时,它将返回成功并向用户显示连接通知。如果用户接受,则设备将连接到WiFi网络,其他应用程序可以连接互联网。但是,如果用户断开网络连接,而您再次致电 WifiManager.STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE
,它将返回@Override
protected void onActivityResult(int requestCode,int resultCode,@Nullable Intent data) {
super.onActivityResult(requestCode,resultCode,data);
if(requestCode == REQUEST_CODE_WIFI_QR_SCANNER && resultCode == RESULT_OK)
{
//WIFI Connection is Successful
}
else
{
//.......
}
}
@RequiresApi(api = Build.VERSION_CODES.Q)
private void startWifiQRCodeScanner(Context context)
{
final String INTENT_ACTION_WIFI_QR_SCANNER = "android.settings.WIFI_DPP_ENROLLEE_QR_CODE_SCANNER";
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if(wifiManager.isEasyConnectSupported())
{
final Intent intent = new Intent(INTENT_ACTION_WIFI_QR_SCANNER);
startActivityForResult(intent,REQUEST_CODE_WIFI_QR_SCANNER);
}
}
错误。
该API似乎仅提供设备可以自动连接的网络的建议列表。但是连接将由操作系统决定。
但是,如果您确实需要解决方案,可以使用未记录的方式使用Android Source中的默认Wifi QR码扫描仪,该方法可以同时检测QR Code方案Zxing和DPP。
这是一个代码示例:
Try below code and indicate your directory like below
async function fetchText() {
let response = await fetch('../demo.txt');
console.log(response.status); // 200
console.log(response.statusText); // OK
if (response.status === 200) {
let data = await response.text();
console.log(data);
// handle data
}
}
fetchText();