我需要使用C#代码将通过usb连接的Android设备上的数据连接切换到我的系统。在网上搜索,我发现madb和madbee库可以从pc操作设备,但似乎这些库中没有这样的功能(我无法找到直接的文档)。
大多数示例都与文件操作和包管理有关。
我的问题:
1)是否可以使用我的C#程序切换android数据连接?
2)是否有任何shell命令来执行此操作?
3)是否有其他库(在其他语言中)能够执行此操作?
任何有用的链接也会有所帮助。
提前致谢。
答案 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,因为这个答案是基于他的回答。