【问题标题】:Turn On/Off Android Device Mobile Data in C# Windows Form Application By Using Xamarin.Android使用 Xamarin.Android 在 C# Windows 窗体应用程序中打开/关闭 Android 设备移动数据
【发布时间】:2019-11-12 16:18:03
【问题描述】:

我有一个 Windows 窗体应用程序。我想更改通过 USB 连接到 PC 的 Android 设备移动数据。

如何使用 Xamarin 在 Windows 窗体应用程序中更改 Android 设备移动数据的状态。

有没有办法改变移动数据的状态?

【问题讨论】:

    标签: c# android xamarin xamarin.forms xamarin.android


    【解决方案1】:

    应该这样做:

    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.");
        }
    }
    

    在清单中启用ChangeNetworkStateModifyPhoneState 权限。

    Android L 目前没有可用的方法来禁用/启用移动数据。

    【讨论】:

      【解决方案2】:

      此任务不需要(实际上没有使用)Xamarin。您只需要Android Debug Bridge (ADB)(有关如何安装它的说明,请参阅链接页面)

      要启用和禁用移动数据连接,请使用命令

      adb shell svc data enable
      adb shell svc data disable
      

      see this answer,我没有将此问题标记为重复,因为它的范围有点不同)

      请注意,必须在设备上启用 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 实例(参见the docs for ProcessStartInfo)一起使用。

      如果有多个设备连接到您的 PC,您可以列出连接的设备

      adb devices
      

      然后使用-s &lt;SERIAL&gt; 选项,选择相应的设备

      public void EnableMobileData(string deviceSerial)
      {
          Process.Start("adb.exe", $"-s {deviceSerial} shell svc data enable");
      }
      

      【讨论】:

      • 优秀。它适用于 Vestel Venus Go。发布:(8.1.0)。开发工具包 (27)。但它不适用于带有 Beats Audio Z715e 的 HTC Sensation XE。发布(4.0.3)。开发工具包 (15)。在启用或禁用数据命令后,它给了我 Permission Denied。
      • @FatihTAN 这似乎取决于。我已经阅读了有关设备必须植根才能使用它们的命令。显然 HTC 不会允许这些命令,除非它是 root 的(可能你必须先su)。
      • 无论如何,因为它适用于我的无根设备,我认为它可以在没有根设备的情况下工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多