Код: Выделить всё
private void connectToWiFi(final String ssid, String password) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
final ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
request.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); // Internet not required
ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
String networkSSID = getNetworkSsid();
if (networkSSID.equals(ssid)) {
connectivityManager.bindProcessToNetwork(network);
}
}
@Override
public void onUnavailable() {
super.onUnavailable();
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
}
};
connectivityManager.registerNetworkCallback(request.build(), networkCallback);
WifiConfiguration config = new WifiConfiguration();
config.SSID = String.format("\"%s\"", ssid);
int netId = -1;
List apList = wifiManager.getConfiguredNetworks();
for (WifiConfiguration i : apList) {
if (i.SSID != null && i.SSID.equals("\"" + ssid + "\"")) {
netId = i.networkId;
}
}
// Add network in Saves network list if it is not available in list
if (netId == -1) {
if (TextUtils.isEmpty(password)) {
Log.d(TAG, "====== Connect to open network");
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
} else {
Log.d(TAG, "====== Connect to secure network");
config.preSharedKey = String.format("\"%s\"", password);
}
netId = wifiManager.addNetwork(config);
}
Log.d(TAG, "Connect to Network : " + netId);
wifiManager.enableNetwork(netId, true);
} else {
// For Android 10 and above
// WifiNetworkSpecifier code
}
}
Код: Выделить всё
Но в большинстве случаев он не работает для сетей без подключения к Интернету.
При попытке подключения к конфигурации Wi-Fi, которая не имеет доступа к Интернету, нам необходимо привязать процесс нашего приложения к этой сети или настроить наш HTTP-клиент на использование фабрики сокетов этой сети, в противном случае система отключится от этой сети Wi-Fi.
Согласно этому руководству, методbindProcessToNetwork уже применен.
Но система отключается от сети независимо от использования методаbindToProcess()/маршрутизации трафика через фабрику сокетов. Это не позволяет оставаться на связи с Wi-Fi без подключения к Интернету.
Это действительно удивительно, Android никогда не задумывался о вариантах использования устройств IoT, прежде чем ограничиваться сетевым подключением.
При попытке подключения к сети Wi-Fi, добавленной моим приложением, приложением системных настроек или любым другим приложением, системные журналы показывают:
Код: Выделить всё
UID xxxxx does not have permission to update configurationТаким образом, приложению разрешено подключаться к предыдущей конфигурации, хотя и с «недостаточными разрешениями», и трафик на мгновение перенаправляется через эту сеть. Но через несколько секунд сеть отключается, и система пытается повторно подключиться к какой-либо другой сети с доступом в Интернет.
Тестирование проводилось на Moto G5 Plus, Android 8.1.0, но я считаю, что это ошибка платформы, а не конкретного устройства. И в основном эта ошибка появляется в Android 7 или что-то в этом роде, потому что раньше она работала.
Я также сообщал о проблеме здесь. В этой проблеме также представлен пример приложения.
Есть ли какое-либо решение этой проблемы?
Есть ли возможность платной поддержки с Android?
Заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/623 ... android-10
Мобильная версия