Как сначала подключиться к локальной сети, а не к интернету в приложении C # Xamarin для Android? - PullRequest
1 голос
/ 13 июня 2019

У меня есть приложение Xamarin для Android. Для некоторых IOT-устройств он подключается к «без Wi-Fi-роутера». Но ему также необходимо использовать сотовые данные для хранения информации в Dropbox.

Теперь это работает следующим образом:

  1. Я могу включить / выключить соединение Wi-Fi программно.
  2. Я не могу включить / выключить сотовые данные (начиная с Android L). Это не разрешено на устройствах без рута.
  3. Когда мой телефон подключен к этому локальному маршрутизатору Wi-Fi и сотовые данные также включены, Android работает по умолчанию, использует Интернет из сотовой связи, и все мои звонки в Dropbox работают без каких-либо проблем.
  4. Но это предпочтение сотовой связи, когда у локального Wi-Fi нет интернета, заставляет мое приложение никогда не подключаться к локальным устройствам. Скажем, одно из моих устройств прослушивает IP 192.168.2.3 через порт 9000, когда я пытаюсь подключиться к нему, мой код выполняет поиск по сотовым данным и возвращает хост не найден.
  5. Так есть ли способ подключения к локальным устройствам в этом сценарии?
  6. В качестве обходного пути я вручную предоставил модальные всплывающие окна, чтобы инструктировать пользователей отключать сотовую связь, когда требуются «не» вызовы Dropbox, такие как подключение к устройствам IOT. Но это не очень хороший пользовательский опыт, так как пользователям приходится постоянно менять сети. Я хотел бы, чтобы код обрабатывал это более прозрачным способом.

Пожалуйста, сообщите.

Ответы [ 3 ]

1 голос
/ 14 июня 2019

После множества попыток и сбоев я смог реализовать предложенный здесь подход: Stackoverflow Link

Я изменил этот код с Java на Xamarin C # и смог заставить Cellular или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
    }
}

Использование:

  1. Где мне нужно заставить сотовую связь, просто позвоните:

SomeClass.ForceCellularOverWifi ();

Там, где мне нужно форсировать Wi-Fi, просто позвоните:

SomeClass.ForceWifiOverCellular ();

Надеюсь, это поможет другим.

0 голосов
/ 13 июня 2019

Используйте Plugin.Essentials (требуется проект NetStandard) и перейдите по этой ссылке:

https://docs.microsoft.com/en-us/xamarin/essentials/connectivity?tabs=android

Попробуйте локальный доступ, а не сеть.

0 голосов
/ 13 июня 2019

Решение, которое я могу придумать, состоит в том, что вы можете попробовать использовать Xamarin.Essentials и проверить профиль соединения, и использовать его для принудительной отправки запросов на ваш Wi-Fi и других запросов через сотовые данные

var profiles = Connectivity.ConnectionProfiles;
if (profiles.Contains(ConnectionProfile.WiFi))
{
    // Active Wi-Fi connection.
}

Документацию можно найти здесь .

...