切换android设备数据连接

时间:2017-03-15 11:25:51

标签: android shell adb command-line-arguments

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

大多数示例都与文件操作和包管理有关。

我的问题:

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

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

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

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

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

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

adb shell svc data enable
adb shell svc data disable

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

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

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

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

答案 1 :(得分:1)

特别感谢@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命令。我们还可以扩展这个类来满足我们的需求,就像我为设备的geting属性所做的那样:

其他用法:

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调试,然后检查&#34;始终允许从此计算机进行USB调试&#34;。确保你得到&#34;设备&#34;序列号后的状态。通过运行&#34; adb设备&#34;来自adb shell的命令,你会得到这样的:

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

如果你没有得到&#34;设备&#34;状态(如上面的第二个和第三个设备),从设备侧断开电缆并重新连接。

这就是全部。

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