Включение / выключение мобильных данных на Android-устройстве в приложении C # Windows Form с помощью Xamarin.Android - PullRequest
1 голос
/ 11 ноября 2019

У меня есть приложение Windows Form. Я хочу изменить данные мобильного устройства Android, которые подключены к ПК через USB.

Как изменить состояние мобильных данных устройства Android в приложении Windows Form с помощью Xamarin.

IsЕсть ли способ изменить состояние мобильных данных?

Ответы [ 2 ]

1 голос
/ 12 ноября 2019

Нет необходимости (на самом деле не использовать) Xamarin для этой задачи. Все, что вам нужно, это Android Debug Bridge (ADB) (инструкции по его установке см. На связанной странице)

Чтобы включить и отключить мобильное подключение для передачи данных, используйте команды

adb shell svc data enable
adb shell svc data disable

( см. Этот ответ , я не помечал этот вопрос как дубликат, поскольку он имеет несколько иную область)

Обратите внимание что на устройстве должна быть включена отладка по USB.

В своем приложении для Windows вы можете реализовать следующий класс для включения или отключения мобильных данных.

class MobileDeviceService
{
    public void DisableMobileData()
    {
        Process.Start("adb.exe", "shell svc data disable");
    }

    public void EnableMobileData()
    {
        Process.Start("adb.exe", "shell svc data enable");
    }
}

Если вы хотите скрыть окно или блок до завершения команды, вы можете использовать Process.Start(ProcessStartInfo) с экземпляром StartInfo (см. документы для ProcessStartInfo), который был настроен соответственно.

Если к вашему устройству подключено более одного устройстваПК, вы можете просмотреть список подключенных устройств с помощью

adb devices

, а затем использовать опцию -s <SERIAL>, чтобы выбрать соответствующее устройство

public void EnableMobileData(string deviceSerial)
{
    Process.Start("adb.exe", $"-s {deviceSerial} shell svc data enable");
}
1 голос
/ 11 ноября 2019

Это должно сделать это:

void SetMobileDataEnabled(bool enabled)
{
    if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.L) {
        Console.WriteLine ("Device does not support mobile data toggling.");
        return;
    }

    try {
        if (Build.VERSION.SdkInt <= Android.OS.BuildVersionCodes.KitkatWatch 
            && Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Gingerbread) {
            Android.Net.ConnectivityManager conman = (Android.Net.ConnectivityManager)GetSystemService (ConnectivityService);
            Java.Lang.Class conmanClass = Java.Lang.Class.ForName (conman.Class.Name);
            Java.Lang.Reflect.Field iConnectivityManagerField = conmanClass.GetDeclaredField ("mService");
            iConnectivityManagerField.Accessible = true;
            Java.Lang.Object iConnectivityManager = iConnectivityManagerField.Get (conman);
            Java.Lang.Class iConnectivityManagerClass = Java.Lang.Class.ForName (iConnectivityManager.Class.Name);
            Java.Lang.Reflect.Method setMobileDataEnabledMethod = iConnectivityManagerClass.GetDeclaredMethod ("setMobileDataEnabled", Java.Lang.Boolean.Type);
            setMobileDataEnabledMethod.Accessible = true;

            setMobileDataEnabledMethod.Invoke (iConnectivityManager, enabled);
        }

        if (Build.VERSION.SdkInt < Android.OS.BuildVersionCodes.Gingerbread) {

            TelephonyManager tm = (TelephonyManager)GetSystemService (Context.TelephonyService);

            Java.Lang.Class telephonyClass = Java.Lang.Class.ForName (tm.Class.Name);
            Java.Lang.Reflect.Method getITelephonyMethod = telephonyClass.GetDeclaredMethod ("getITelephony");
            getITelephonyMethod.Accessible = true;

            Java.Lang.Object stub = getITelephonyMethod.Invoke (tm);
            Java.Lang.Class ITelephonyClass = Java.Lang.Class.ForName (stub.Class.Name);

            Java.Lang.Reflect.Method dataConnSwitchMethod = null;
            if (enabled) {
                dataConnSwitchMethod = ITelephonyClass
                    .GetDeclaredMethod ("disableDataConnectivity");
            } else {
                dataConnSwitchMethod = ITelephonyClass
                    .GetDeclaredMethod ("enableDataConnectivity");   
            }

            dataConnSwitchMethod.Accessible = true;
            dataConnSwitchMethod.Invoke (stub);
        } 
    } catch (Exception ex) {
        Console.WriteLine ("Device does not support mobile data toggling.");
    }
}

Включите разрешения ChangeNetworkState и ModifyPhoneState в вашем манифесте.

В Android L в настоящее время нет доступных способов отключить / включить мобильные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...