【发布时间】:2019-11-12 16:18:03
【问题描述】:
我有一个 Windows 窗体应用程序。我想更改通过 USB 连接到 PC 的 Android 设备移动数据。
如何使用 Xamarin 在 Windows 窗体应用程序中更改 Android 设备移动数据的状态。
有没有办法改变移动数据的状态?
【问题讨论】:
标签: c# android xamarin xamarin.forms xamarin.android
我有一个 Windows 窗体应用程序。我想更改通过 USB 连接到 PC 的 Android 设备移动数据。
如何使用 Xamarin 在 Windows 窗体应用程序中更改 Android 设备移动数据的状态。
有没有办法改变移动数据的状态?
【问题讨论】:
标签: c# android xamarin xamarin.forms xamarin.android
应该这样做:
void SetMobileDataEnabled(bool enabled)
{
if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.L) {
Console.WriteLine ("Device does not support mobile data toggling.");
return;
}
try {
if (Build.VERSION.SdkInt <= Android.OS.BuildVersionCodes.KitkatWatch
&& Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Gingerbread) {
Android.Net.ConnectivityManager conman = (Android.Net.ConnectivityManager)GetSystemService (ConnectivityService);
Java.Lang.Class conmanClass = Java.Lang.Class.ForName (conman.Class.Name);
Java.Lang.Reflect.Field iConnectivityManagerField = conmanClass.GetDeclaredField ("mService");
iConnectivityManagerField.Accessible = true;
Java.Lang.Object iConnectivityManager = iConnectivityManagerField.Get (conman);
Java.Lang.Class iConnectivityManagerClass = Java.Lang.Class.ForName (iConnectivityManager.Class.Name);
Java.Lang.Reflect.Method setMobileDataEnabledMethod = iConnectivityManagerClass.GetDeclaredMethod ("setMobileDataEnabled", Java.Lang.Boolean.Type);
setMobileDataEnabledMethod.Accessible = true;
setMobileDataEnabledMethod.Invoke (iConnectivityManager, enabled);
}
if (Build.VERSION.SdkInt < Android.OS.BuildVersionCodes.Gingerbread) {
TelephonyManager tm = (TelephonyManager)GetSystemService (Context.TelephonyService);
Java.Lang.Class telephonyClass = Java.Lang.Class.ForName (tm.Class.Name);
Java.Lang.Reflect.Method getITelephonyMethod = telephonyClass.GetDeclaredMethod ("getITelephony");
getITelephonyMethod.Accessible = true;
Java.Lang.Object stub = getITelephonyMethod.Invoke (tm);
Java.Lang.Class ITelephonyClass = Java.Lang.Class.ForName (stub.Class.Name);
Java.Lang.Reflect.Method dataConnSwitchMethod = null;
if (enabled) {
dataConnSwitchMethod = ITelephonyClass
.GetDeclaredMethod ("disableDataConnectivity");
} else {
dataConnSwitchMethod = ITelephonyClass
.GetDeclaredMethod ("enableDataConnectivity");
}
dataConnSwitchMethod.Accessible = true;
dataConnSwitchMethod.Invoke (stub);
}
} catch (Exception ex) {
Console.WriteLine ("Device does not support mobile data toggling.");
}
}
在清单中启用ChangeNetworkState 和ModifyPhoneState 权限。
Android L 目前没有可用的方法来禁用/启用移动数据。
【讨论】:
此任务不需要(实际上没有使用)Xamarin。您只需要Android Debug Bridge (ADB)(有关如何安装它的说明,请参阅链接页面)
要启用和禁用移动数据连接,请使用命令
adb shell svc data enable
adb shell svc data disable
(see this answer,我没有将此问题标记为重复,因为它的范围有点不同)
请注意,必须在设备上启用 USB 调试。
在您的 Windows 应用程序中,您可以实现以下类来启用或禁用移动数据。
class MobileDeviceService
{
public void DisableMobileData()
{
Process.Start("adb.exe", "shell svc data disable");
}
public void EnableMobileData()
{
Process.Start("adb.exe", "shell svc data enable");
}
}
如果您想在命令完成之前隐藏窗口或阻止,您可以将Process.Start(ProcessStartInfo) 与已分别配置的StartInfo 实例(参见the docs for ProcessStartInfo)一起使用。
如果有多个设备连接到您的 PC,您可以列出连接的设备
adb devices
然后使用-s <SERIAL> 选项,选择相应的设备
public void EnableMobileData(string deviceSerial)
{
Process.Start("adb.exe", $"-s {deviceSerial} shell svc data enable");
}
【讨论】:
su)。