我需要在不与用户交互的情况下以编程方式将 android 设备连接到 wifi。值得注意的是,此应用程序是专门构建的,不会出现在 Play 商店或公开部署(我这样说是因为我需要做的事情可能会有严重的安全问题)。
这是我如何以编程方式连接设备
TextView textFeedback = findViewById(R.id.text);
ConnectivityManager.NetworkCallback wifiConnectionCallback = new ConnectivityManager.NetworkCallback(){
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
Log.e(logTAG, "wifi connected");
textFeedback.setText("wifi connected");
}
@Override
public void onLosing(@NonNull Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
Log.e(logTAG, "losing wifi connection");
textFeedback.setText("losing wifi connection");
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
Log.e(logTAG, "lost wifi connection");
textFeedback.setText("lost wifi connection");
}
@Override
public void onUnavailable() {
super.onUnavailable();
Log.e(logTAG, "user closed wifi connection");
textFeedback.setText("user closed wifi connection");
}
};
// instantiate connectivity manager
ConnectivityManager connectivityManager = (ConnectivityManager) this.getApplicationContext().getSystemService(this.CONNECTIVITY_SERVICE);
// connect to phl via wifi
Thread wifiConnectionThread = new Thread(new Runnable()
{
@Override
public void run()
{
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q)
{
NetworkSpecifier networkSpecifier = new WifiNetworkSpecifier.Builder()
.setSsid(ssid)
.build();
NetworkRequest networkRequest = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(networkSpecifier)
.build();
connectivityManager.requestNetwork(networkRequest, wifiConnectionCallback);
}
}
});
wifiConnectionThread.start();
除了一个例外,这工作得很好。它会提示用户询问他们是否愿意连接到网络。这是有问题的,因为即使没有用户,我也需要连接设备(因此需要以编程方式执行此操作,周围通常不会有用户)。有没有办法做到这一点(最好不要生根设备)?例如,是否可以将其设置为仅提示用户一次,并且从那时起它是自动的?
几年前,我在开发一个小型网关以从我们的 BLE 传感器收集数据并通过 Wi-Fi 将其推送到我们的后端时遇到了完全相同的问题。
当时我用的是GitHub上公开的一个小库,叫WifiUtils。您可以在此链接之后找到该库。
使用起来非常简单,您可以从 GitHub 的 README.md 中获取大量信息。
启用 Wi-Fi:
WifiUtils.withContext(getApplicationContext()).enableWifi();
扫描 Wi-Fi 网络:
WifiUtils.withContext(getApplicationContext()).scanWifi(this::getScanResults).start();
private void getScanResults(@NonNull final List<ScanResult> results)
{
if (results.isEmpty())
{
Log.i(TAG, "SCAN RESULTS IT'S EMPTY");
return;
}
Log.i(TAG, "GOT SCAN RESULTS " + results);
}
最后连接到他们:
WifiUtils.withContext(getApplicationContext())
.connectWith("JohnDoeWiFi", "JohnDoePassword")
.setTimeout(40000)
.onConnectionResult(new ConnectionSuccessListener() {
@Override
public void success() {
Toast.makeText(MainActivity.this, "SUCCESS!", Toast.LENGTH_SHORT).show();
}
@Override
public void failed(@NonNull ConnectionErrorCode errorCode) {
Toast.makeText(MainActivity.this, "EPIC FAIL!" + errorCode.toString(), Toast.LENGTH_SHORT).show();
}
})
.start();
由于该库的所有代码都在 GitHub 中,您可能会在那里找到更多信息。
对不起你不能这样做...
实际Android设备连接的最佳解决方案是启动意图打开WiFi设置并观察当前的WiFi网络。
要启用 WiFi,您必须向用户询问!!!