Как сначала подключиться к локальной сети, а не к интернету в приложении C# Xamarin для Android?
У меня есть приложение Xamarin для Android. Для некоторых IOT-устройств он подключается к "без Wi-Fi-роутера". Но также необходимо использовать сотовые данные для хранения информации в Dropbox.
Теперь это работает следующим образом:
- Я могу включить / выключить соединение Wi-Fi программно.
- Я не могу включить / выключить сотовые данные (начиная с Android L). Это не разрешено на устройствах без рута.
- Когда мой телефон подключен к этому локальному маршрутизатору Wi-Fi и сотовые данные также включены, Android работает по умолчанию, он использует Интернет из сотовой связи, и все мои звонки в Dropbox работают без каких-либо проблем.
- Но это предпочтение сотовой связи, когда у локального Wi-Fi нет интернета, заставляет мое приложение никогда не подключаться к локальным устройствам. Скажем, одно из моих устройств прослушивает IP 192.168.2.3 через порт 9000, когда я пытаюсь подключиться к нему, мой код выполняет поиск по сотовым данным и возвращает хост не найден.
- Так есть ли способ подключения к локальным устройствам в этом сценарии?
- В качестве обходного пути я вручную предоставил модальные всплывающие окна, чтобы инструктировать пользователей отключать сотовую связь, когда требуются "не" вызовы Dropbox, такие как подключение к устройствам IOT. Но это не очень хороший пользовательский опыт, так как пользователям приходится постоянно менять сети. Я хотел бы, чтобы код обрабатывал это более прозрачным способом.
Пожалуйста, порекомендуйте.
3 ответа
После многих попыток и неудач я смог реализовать подход, представленный здесь: Stackru Link
Я изменил этот код с Java на Xamarin C# и смог программно выбрать сотовую сеть или Wi-Fi в качестве предпочтительной сети.
Моя реализация:
using Android.Net;
public SomeClass{
public static Context _context = Android.App.Application.Context;
....
/// <summary>
/// Forces the wifi over cellular.
/// </summary>
public static void ForceWifiOverCellular()
{
ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.AddTransportType(TransportType.Wifi);
var callback = new ConnectivityManager.NetworkCallback();
connection_manager.RegisterNetworkCallback(request.Build(), new CustomNetworkAvailableCallBack());
}
/// <summary>
/// Forces the cellular over wifi.
/// </summary>
public static void ForceCellularOverWifi()
{
ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.AddTransportType(TransportType.Cellular);
connection_manager.RegisterNetworkCallback(request.Build(), new CustomNetworkAvailableCallBack());
}
}
/// <summary>
/// Custom network available call back.
/// </summary>
public class CustomNetworkAvailableCallBack : ConnectivityManager.NetworkCallback
{
public static Context _context = Android.App.Application.Context;
ConnectivityManager connection_manager = (ConnectivityManager)_context.GetSystemService(Context.ConnectivityService);
public override void OnAvailable(Network network)
{
//ConnectivityManager.SetProcessDefaultNetwork(network); //deprecated (but works even in Android P)
connection_manager.BindProcessToNetwork(network); //this works in Android P
}
}
Использование:
- Где мне нужно заставить сотовых, просто позвоните:
SomeClass.ForceCellularOverWifi ();
- Где мне нужно заставить Wi-Fi, просто позвоните:
SomeClass.ForceWifiOverCellular ();
Надеюсь, что это помогает другим.
Решение, которое я могу придумать, состоит в том, что вы можете попробовать использовать Xamarin.Essentials и проверить профиль соединения, и использовать его для принудительной отправки запросов на ваш Wi-Fi, а также других запросов через сотовые данные.
var profiles = Connectivity.ConnectionProfiles;
if (profiles.Contains(ConnectionProfile.WiFi))
{
// Active Wi-Fi connection.
}
Документацию можно найти здесь.
Используйте Plugin.Essentials (требуется проект NetStandard) и перейдите по этой ссылке:
https://docs.microsoft.com/en-us/xamarin/essentials/connectivity?tabs=android
попробуй локальный доступ а не сетевой.