如何使用 Xamarin 在 Android 上禁用移动数据 [英] How to disable Mobile Data on Android with Xamarin

查看:25
本文介绍了如何使用 Xamarin 在 Android 上禁用移动数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在 Android 上禁用移动数据的类似问题.唯一的区别是我想用 Xamarin 而不是 Java.

similar question to How to disable Mobile Data on Android . the only difference is that i want to do that with Xamarin but not java.

我尝试了下面的代码,但它什么也没做.

I tried the code below but it did nothing.

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

所以我的问题是:无论如何要使用 xamarin 在 Android 上禁用移动数据?或者无论如何使用java反射技术".用 xamarin?

so my question is that: is there anyway to disable Mobile Data on Android with xamarin? or is there anyway to use "java reflection technique". with xamarin?

推荐答案

通常,Xamarin 在与 Android 交互时使用与 Java 相同的方法.因此最好将等效的 Java 代码移植到 C#;在这种情况下,翻译您链接到的答案中的反射代码.

Typically Xamarin uses the same methodology as Java when interacting with Android. Therefore its best to just port over the equivalent Java code to C#; in this case translating the reflection code in the answer you linked to.

这是一个结合了姜饼和更高支持Froyo 和较低的支持:

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 权限.

Enable the ChangeNetworkState and ModifyPhoneState permissions in your manifest.

Android L 目前没有可用的方法来禁用/启用移动数据.

Android L currently has no available way to disable/enable mobile data.

这篇关于如何使用 Xamarin 在 Android 上禁用移动数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆