Android автоматически отключается от Wi-Fi без Интернета ниже Android 10Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android автоматически отключается от Wi-Fi без Интернета ниже Android 10

Сообщение Anonymous »

Работаю над приложением для Android, в котором мне нужно программно подключить Wi-Fi-устройство, у которого нет Интернета. Вот код:

Код: Выделить всё

    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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»