Xamarin.Forms — установка маски подсети WiFi на устройстве Android

Я столкнулся с проблемой, когда мое приложение для Android не может устанавливать исходящие соединения с использованием класса TcpClient (вопрос расположен здесь). Во время отладки и проведения дальнейших исследований я обнаружил, что мое устройство Android (уровень API 22) получает маску подсети 0.0.0.0 при подключении к моей сети WiFi. Мой DHCP-сервер настроен на использование 255.255.255.0, поэтому я считаю, что это несоответствие может быть корнем моей другой проблемы. Это мой код:

//Connect to the WiFi network
int id = WiFiManager.AddNetwork(new WifiConfiguration()
{
    Ssid = $"\"{ssid}\"",
    PreSharedKey = $"\"{password}\""
});
WiFiManager.EnableNetwork(id, true);
WiFiManager.Reconnect();

//Retrieve subnet mask (for debugging) 
int subnet_mask = WiFiManager.DhcpInfo.Netmask;

subnet_mask возвращает 0, а отформатированная версия класса DhcpInfo показывает:

{ipaddr 10.0.0.15 gateway 10.0.0.0 netmask 0.0.0.0 dns1 10.0.0.0 dns2 0.0.0.0 DHCP server
10.0.0.0 lease 43200 seconds}

В этой ситуации можно ли вручную изменить маску подсети (или "сетевую маску") в Android API? Я пытался использовать статическую IP-конфигурацию, как показано здесь, но использование этих настроек устарело на уровне API 17. Я также пытался установить свойство DhcpInfo.Netmask вручную, но для этого требуется int. Я рассчитал один на основе этого ответа, но он был слишком большим и стал uint. Наконец, я просмотрел множество классов, включая Android.Net.Wifi.WifiManager, чтобы узнать, есть ли способ изменить сетевую маску. Я ничего не нашел, но, возможно, я просто искал не в тех местах.

Любая помощь приветствуется!

Обновление:

По соображениям безопасности кажется, что это невозможно со стандартным Android API. Тем не менее, может ли Android NDK изменить маску подсети? Я понимаю, что он предоставляет доступ к устройству на более низком уровне, и мне не нужно помещать это приложение в магазин приложений (это для моего использовать только).


person Micah Vertal    schedule 20.01.2019    source источник


Ответы (1)


Из соображений безопасности ОС Android может не позволить вам это сделать.

Я знаю, как пользователь, я бы не хотел, чтобы приложение меняло конфигурацию моей сети.

Кажется, это можно было сделать в прошлом: https://stackoverflow.com/a/7142316/2913599 но этот API устарел/устарел на уровне API 17: https://developer.android.com/reference/android/provider/Settings.System.html#WIFI_STATIC_DNS1

В документах говорится, что вместо этого следует использовать WifiManager, но этот API не позволяет изменять ip, dns, шлюз, опять же, из соображений безопасности.

Если вам нужно изменить эти настройки, возможно, вы можете предоставить страницу с инструкциями для пользователей, чтобы они могли изменить их самостоятельно.

person Leon Lu - MSFT    schedule 21.01.2019
comment
Прошу прощения, что не ответил @Leon. Можно ли это сделать с помощью Android NDK? Если да, то как мне начать использовать его с Xamarin.Forms.Android? Я слышал, что он обеспечивает более низкоуровневый доступ, и оговорка о невозможности опубликовать его в магазине приложений для меня не проблема (приложение предназначено только для моего использования). - person Micah Vertal; 26.01.2019
comment
Я не знаком с Android NDK. Поэтому я не даю вам результат о да или нет, но Xamarin.Forms.Android не достигает этого. Xamarin.Forms.Android просто используется для разработки приложения для Android. - person Leon Lu - MSFT; 29.01.2019
comment
Хорошо. Я воздержусь от выбора этого в качестве ответа на случай, если кто-то еще внес свой вклад в эту ситуацию. Спасибо за помощь. - person Micah Vertal; 03.02.2019