切换 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,因为这个答案是基于他的回答。
我需要使用 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,因为这个答案是基于他的回答。