如何在Android上禁用移动的数据与Xamarin

emeijp43  于 2023-09-28  发布在  Android
关注(0)|答案(2)|浏览(122)

类似于How to disable Mobile Data on Android的问题。唯一的区别是我想用Xamarin而不是Java来做这件事。
我尝试了下面的代码,但它什么也没做。

var conn = ApplicationContext.GetSystemService(ConnectivityService).JavaCast<ConnectivityManager>();
        var connState = conn.StopUsingNetworkFeature(ConnectivityType.Mobile, "");

所以我的问题是:有没有办法禁用移动的数据在Android上与xamarin?还是有办法使用“Java反射技术”。关于Xamarin?

tzdcorbm

tzdcorbm1#

通常,Xamarin在与Android交互时使用与Java相同的方法。因此,最好将等价的Java代码移植到C#;在本例中,翻译您链接到的答案中的反射代码。
下面是一个结合了Gingerbread and higher supportFroyo 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.");
    }
}

在清单中启用ChangeNetworkStateModifyPhoneState权限。
Android L目前没有禁用/启用移动的数据的方法。

vyu0f0g1

vyu0f0g12#

在xamarin android中,如果你想禁用移动的Hive数据,你可以这样使用。

TelephonyManager tm = (TelephonyManager)Android.App.Application.Context.GetSystemService(Context.TelephonyService);
 
var tdata = tm.DataEnabled;
if (tdata)
    tdata = false;

相关问题