【问题标题】:Toggle android device data connection切换 android 设备数据连接
【发布时间】:2017-08-06 02:42:50
【问题描述】:

我需要使用 C# 代码在通过 USB 连接到我的系统的 Android 设备上切换数据连接。在网上搜索,我找到了 madb 和 madbee 库来从 pc 操作设备,但似乎这些库中没有这样的功能(我找不到直截了当的文档)。

大多数示例都是关于文件操作和包管理的。

我的问题:

1) 是否可以使用我的 C# 程序切换 android 数据连接??

2) 是否有任何 shell 命令可以执行此操作??

3) 是否有任何其他库(其他语言)能够执行此操作??

任何有用的链接也会有所帮助。

提前致谢。

【问题讨论】:

    标签: android shell adb command-line-arguments


    【解决方案1】:

    因此,您希望通过您的 Windows PC 上的 USB 连接,使用任何库或将与 C# 接口的东西,从您的 Bounty 文本中打开或关闭移动数据。

    Windows 上的大多数语言都有一些访问终端/命令提示符命令的方法。这样,只要您有根设备或系统应用程序,您就可以通过 ADB 运行以下命令:

    adb shell svc data enable
    adb shell svc data disable
    

    不幸的是,通过使用Telephony 的应用程序以编程方式执行类似操作也需要MODIFY_PHONE_STATE 权限,这意味着非root 设备上的非系统应用程序无法执行此操作

    如果您不想自己创建应用程序,有人使用广播接收器为此目的制作了app。开发者在这里有一个blog post,详细说明了如何使用它通过 adb 接收广播:

    adb shell am broadcast -a yp.data.handlebroadcast -n yp.data.handle/.DataChangeReceiver --ez "wifiEnable" "true" --ez "mobileDataEnable" "true"
    

    应用没有指定,但应该需要root权限

    【讨论】:

    • 谢谢一百万。您的回答非常有用,我根据您的详细回答找到了确切的解决方案。为了让其他访问者在 stackoverflow 中获得最快的解决方案,我将我的标记为答案并投票并授予你的答案。如果可能的话,我会诚实地把我所有的观点都给你,因为你这周帮我解决了一个大问题。再次感谢
    【解决方案2】:

    特别感谢@Nick Cardoso 的详细而有用的回答(获奖如下)。

    我找到了适用于 ROOTED 和 UNROOTED 设备的解决方案(无需在设备上安装任何应用程序)。

    由于 MabBee 库在 x86 和 x64 架构上存在一些问题(MoreLinq 库存在问题),我决定不使用 MabBee 并使用 C# Process 类直接从 adb.exe 文件执行 ShellCommands(可能在其他语言中可能)。唯一需要的三个文件是 adb.exe、AdbWinApi.dll 和 AdbWinUsbApi.dll(都存在于 android sdk platform-tools 文件夹中)

    我创建了两个类 MyAdbManager.cs 和 MyDevice.cs 如下:

    MyAdbManager.cs

    public class MyAdbManager
        {
            private string _adbFileName;
    
            public MyAdbManager(string adbFileName)
            {
                _adbFileName = adbFileName;
            }
    
            public string ExecuteShellCommand(string command)
            {
                Process proc = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        FileName = _adbFileName,
                        Arguments = command,
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        CreateNoWindow = true
                    }
                };
    
                proc.Start();
                return proc.StandardOutput.ReadToEnd().Trim();
            }
    
            //this method skips unauthorized devices, becuase commands do not execute
            //on unauthorized devices and we need to run adb kill-server, which
            //doesnt solve the problem all the time.
            public List<MyDevice> GetDevices()
            {
                string output = ExecuteShellCommand("devices");
                List<string> serials = output.Split('\n').ToList();
                serials = serials.GetRange(1, serials.Count - 1); //skip the first line of output
                List<MyDevice> myDevices = new List<MyDevice>();
                foreach (var item in serials)
                {
                    if (item.Contains("device"))
                    {
                        myDevices.Add(new MyDevice(item.Split('\t')[0], _adbFileName));
                    }
                }
    
                return myDevices;
            }
        }
    

    MyDevice.cs

    public class MyDevice
        {
            private string _adbFileNme;
            public string Serial { get; }
            public string Model { get; }
            public string Product { get; }
    
            public MyDevice(string serial, string adbFileName)
            {
                _adbFileNme = adbFileName;
                Serial = serial;
                Model = GetSpecificProperty("ro.product.model");
                Product = GetSpecificProperty("ro.build.product");
            }
    
            public override string ToString()
            {
                return $"Model: {Model}, Serial: {Serial}, Product: {Product}";
            }
            public string ExecuteShellCommand(string command)
            {
                Process proc = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        FileName = _adbFileNme,
                        Arguments = command,
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        CreateNoWindow = true
                    }
                };
    
                proc.Start();
                return proc.StandardOutput.ReadToEnd().Trim();
            }
    
            public string GetAllPropertirs()
            {
                return ExecuteShellCommand($"-s {Serial} shell getprop");
            }
    
            public string GetSpecificProperty(string propertyName)
            {
                return ExecuteShellCommand($"-s {Serial} shell getprop {propertyName}");
            }
    
            public void EnableData()
            {
                ExecuteShellCommand($"-s {Serial} shell svc data enable");
            }
    
            public void DisableData()
            {
                ExecuteShellCommand($"-s {Serial} shell svc data disable");
            }
    
            public void RestartData()
            {
                DisableData();
                EnableData();
            }
        }
    

    有了这些类,我们可以使用下面的简单代码来打开/关闭数据连接:

    用法:

    MyAdbManager manager = new MyAdbManager("/path/to/adb.exe"); // with AdbWinApi.dll and AdbWinUsbApi.dll files in directory
    myDevices = manager.GetDevices();
    myDevices[0].EnableData(); 
    myDevices[1].DisableData();
    myDevices[2].RestartData();
    

    我们可以在每台设备上或使用 MyAdbManager 执行原始 shell 命令。我们还可以扩展这个类来满足我们的需求,就像我为获取设备属性所做的那样:

    其他用法:

    Console.WriteLine(myDevices[0].GetAllPropertirs());
    Console.WriteLine(myDevices[0].GetSpecificProperty("ro.build.version.release"));
    Console.WriteLine(myDevices[0].GetSpecificProperty("ro.build.version.incremental"));
    Console.WriteLine(myDevices[0].GetSpecificProperty("vzw.os.rooted"));
    Console.WriteLine(myDevices[0].GetSpecificProperty("wifi.interface"));
    

    注意:只需在您的设备上启用 USB 调试并选中“始终允许从这台计算机进行 USB 调试”。确保在序列号之后获得“设备”状态。通过从 adb shell 运行“adb devices”命令,你会得到这样的结果:

    List of devices attached
    48a4ce9f        device      //This device will work
    de16d6b2        offline     //This device will not work
    g5e23f2a        unauthorize //This device will not work
    

    如果您没有获得“设备”状态(如上面的第二个和第三个设备),请从设备端断开电缆并重新连接。

    就是这样。

    我再次特别感谢@Nick Cardoso,因为这个答案是基于他的回答。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2016-08-18
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      • 1970-01-01
      相关资源
      最近更新 更多