如何使用 Xamarin 在 Android 上禁用移动数据
How to disable Mobile Data on Android with Xamarin
与 How to disable Mobile Data on Android 类似的问题。
唯一的区别是我想用 Xamarin 而不是 java.
我尝试了下面的代码,但它什么也没做。
var conn = ApplicationContext.GetSystemService(ConnectivityService).JavaCast<ConnectivityManager>();
var connState = conn.StopUsingNetworkFeature(ConnectivityType.Mobile, "");
所以我的问题是:是否可以使用 xamarin 在 Android 上禁用移动数据?还是无论如何都可以使用 "java reflection technique"。使用 xamarin?
Xamarin 在与 Android 交互时通常使用与 Java 相同的方法。因此,最好将等效的 Java 代码移植到 C#;在这种情况下,翻译您链接到的答案中的反射代码。
这里是一个端口,结合了Gingerbread and higher support and Froyo and lower support:
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 目前无法使用 disable/enable 移动数据。
在 xamarin android 中,如果您想禁用移动蜂窝数据,您可以像这样使用。
TelephonyManager tm = (TelephonyManager)Android.App.Application.Context.GetSystemService(Context.TelephonyService);
var tdata = tm.DataEnabled;
if (tdata)
tdata = false;
与 How to disable Mobile Data on Android 类似的问题。 唯一的区别是我想用 Xamarin 而不是 java.
我尝试了下面的代码,但它什么也没做。
var conn = ApplicationContext.GetSystemService(ConnectivityService).JavaCast<ConnectivityManager>();
var connState = conn.StopUsingNetworkFeature(ConnectivityType.Mobile, "");
所以我的问题是:是否可以使用 xamarin 在 Android 上禁用移动数据?还是无论如何都可以使用 "java reflection technique"。使用 xamarin?
Xamarin 在与 Android 交互时通常使用与 Java 相同的方法。因此,最好将等效的 Java 代码移植到 C#;在这种情况下,翻译您链接到的答案中的反射代码。
这里是一个端口,结合了Gingerbread and higher support and Froyo and lower support:
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 目前无法使用 disable/enable 移动数据。
在 xamarin android 中,如果您想禁用移动蜂窝数据,您可以像这样使用。 TelephonyManager tm = (TelephonyManager)Android.App.Application.Context.GetSystemService(Context.TelephonyService);
var tdata = tm.DataEnabled;
if (tdata)
tdata = false;