切换 android 设备数据连接

Toggle android device data connection

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

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

我的问题:

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

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

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

任何有用的链接也很有帮助。

提前致谢。

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

windows 上的大多数语言都可以通过某种方式访问​​ terminal/command 提示命令。这样一来,只要您拥有已获得 root 权限的设备或系统应用程序,您就可以通过 ADB 运行 执行以下操作:

adb shell svc data enable
adb shell svc data disable

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

如果您不想自己创建一个应用程序,开发人员在这里制作了一个app just for this purpose using broadcast receivers. There is a blog post,详细说明了如何使用它通过 adb 接收广播:

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

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

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

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

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

我创建了两个 classes 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();
        }
    }

有了这些 classes,我们可以使用如下简单的代码来切换数据连接 on/off:

用法:

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 命令。我们还可以扩展此 class 以满足我们的需求,就像我为获取设备属性所做的那样:

其他用法:

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 调试并检查 "Always Allow usb debugging from this computer"。确保在序列号后得到 "device" 状态。通过来自 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

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

就这些了。

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