如何判断“移动网络数据”启用或禁用(即使通过无线连接)?(How to tell if 'M

2019-06-18 11:50发布

我有,我希望能够用得到从远程查询的连接状态报告的应用程序。

我想知道,如果无线网络连接,如果数据访问是通过移动网络启用。

如果WiFi超出范围,我想知道如果我可以依靠移动网络上。

问题是,启用的数据,当我通过无线网络连接总是返回为真,我只能正确查询移动网络时没有无线网络连接。

所有我见过的答案建议投票查看当前连接的是什么,但我想知道,如果移动网络可用时我需要它,即使我可能会通过无线网络目前连接。

反正告诉移动网络数据是否在没有轮询启用,看是否已连接的?

编辑

因此,当通过无线网络连接。如果我去设置,取消“启用数据”,然后在我的应用我这样做:

 boolean mob_avail = 
 conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isAvailable();

mob_avail返回为“真”,但我有禁用移动网络数据,所以我希望它是“假”

如果我关掉无线网络,有(正确),为我已禁用移动网络数据没有联系。

让我怎么检查,如果当我通过无线网络连接启用移动网络的数据?

UPDATE

我看了看作为由ss1271的意见建议getAllNetworkInfo()

我输出以下三个条件下返回有关移动网络的信息

WiFi关闭 - 移动数据上

WiFi打开 - 移动数据关闭

WiFi打开 - 移动数据上

并得到了以下结果:

随着WiFi关闭:

移动[HSUPA],状态:连接/连接,原因:未知的,额外的:互联网,漫游:假故障:假的,isAvailable:真,FEATUREID:-1,userDefault:假

随着WiFi开/关手机

的NetworkInfo:类型:移动[HSUPA],状态:已断开连接/断开,原因:connectionDisabled,额外:(无),漫游:假的,故障切换:假,isAvailable:真,FEATUREID:-1,userDefault:假

随着WiFi开/移动对

的NetworkInfo:类型:移动[HSPA],状态:已断开连接/断开,原因:connectionDisabled,额外:(无),漫游:假的,故障切换:假,isAvailable:真,FEATUREID:-1,userDefault:假

所以你可以看到isAvailable每次回到真实的,国家只表现为断开Wi-Fi时在影响。

澄清

不是在寻找,看看我的手机目前由移动网络连接。 试图建立用户是否已经启用了移动网络/禁用数据访问。 >无线和网络设置 - - >移动网络设置 - 他们可以通过进入设置打开和关闭该>已启用数据

Answer 1:

如果“移动数据”已启用与否,不管是否存在是目前或者判断的WiFi启用/主动或不移动数据有效连接下面的代码会告诉你。 此代码仅适用于Android 2.3(姜饼),后来。 其实这个代码也可以在早期版本的Android,以及;-)

    boolean mobileDataEnabled = false; // Assume disabled
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    try {
        Class cmClass = Class.forName(cm.getClass().getName());
        Method method = cmClass.getDeclaredMethod("getMobileDataEnabled");
        method.setAccessible(true); // Make the method callable
        // get the setting for "mobile data"
        mobileDataEnabled = (Boolean)method.invoke(cm);
    } catch (Exception e) {
        // Some problem accessible private API
        // TODO do whatever error handling you want here
    }

注意:您需要有权限android.permission.ACCESS_NETWORK_STATE才能够使用这个代码。



Answer 2:

我已经升级Allesio的答案。 自从4.2.2 Settings.Secure的mobile_data INT已经转移到Settings.Global。

试试这个代码,当你想知道,如果Wi-Fi时被启用,连接移动网络下也能。

更新检查SIM卡是否可用。 感谢您指出穆拉特。

boolean mobileYN = false;

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
    if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
    {
        mobileYN = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 1) == 1;
    }
    else{
        mobileYN = Settings.Secure.getInt(context.getContentResolver(), "mobile_data", 1) == 1;
    }
}


Answer 3:

一种方法是检查用户是否有设置,其中最有可能会,如果无线网络熄灭使用激活的移动数据。 此作品(测试),并且它不使用反射,虽然它使用的API中隐藏的价值:

boolean mobileDataAllowed = Settings.Secure.getInt(getContentResolver(), "mobile_data", 1) == 1;

根据不同的API,你需要检查的,而不是Settings.Secure Settings.Global,由@ user1444325指出。

来源: Android的API调用来确定用户设置“已启用数据”



Answer 4:

@ sNash的功能的伟大工程。 但在少数设备,我发现它返回true,即使数据被禁用。 所以,我发现一个替代的解决方案,其是在Android的API。

getDataState()的方法TelephonyManager将是非常有用的。

我更新@ snash与使用上述功能的功能。 以下函数返回false时,蜂窝数据被禁用,否则真。

private boolean checkMobileDataIsEnabled(Context context){
        boolean mobileYN = false;

        TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        if (tm.getSimState() == TelephonyManager.SIM_STATE_READY) {
            TelephonyManager tel = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
//          if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1)
//          {
//              mobileYN = Settings.Global.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
//          }
//          else{
//              mobileYN = Settings.Secure.getInt(context.getContentResolver(), "mobile_data", 0) == 1;
//          }
            int dataState = tel.getDataState();
            Log.v(TAG,"tel.getDataState() : "+ dataState);
            if(dataState != TelephonyManager.DATA_DISCONNECTED){
                mobileYN = true;
            }

        }

        return mobileYN;
    }


Answer 5:

你可以尝试这样的事情:

ConnectivityManager conMan = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);

//mobile
State mobile = conMan.getNetworkInfo(0).getState();

//wifi
State wifi = conMan.getNetworkInfo(1).getState();


if (mobile == NetworkInfo.State.CONNECTED || mobile == NetworkInfo.State.CONNECTING) 
{
    //mobile
}
else if (wifi == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTING) 
{
    //wifi
}

如果你有兴趣,如果你真的连接,使用

NetworkInfo.State.CONNECTED 

只是,而不是

NetworkInfo.State.CONNECTED || NetworkInfo.State.CONNECTING


Answer 6:

这里是一个xamarin解决这个问题:

    public static bool IsMobileDataEnabled()
    {
        bool result = false;

        try
        {
            Context context = //get your context here or pass it as a param

            if (Build.VERSION.SdkInt >= BuildVersionCodes.JellyBeanMr1)
            {
                //Settings comes from the namespace Android.Provider
                result = Settings.Global.GetInt(context.ContentResolver, "mobile_data", 1) == 1;
            }
            else
            {
                result = Settings.Secure.GetInt(context.ContentResolver, "mobile_data", 1) == 1;
            }
        }
        catch (Exception ex)
        {
            //handle exception
        }

        return result;
    }

PS:请确保您有此代码的所有权限。



Answer 7:

您必须使用ConnectivityManager和的NetworkInfo细节,可以发现这里



Answer 8:

我认为使用NetworkInfo类和isConnected应该工作:

ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

return info != NULL || info.isConnected();

并检查移动数据或许连接。 直到我测试它,我不能肯定。 我不能做,直到明天。

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

if(tm .getDataState() == tm .DATA_CONNECTED)
   return true;


Answer 9:

To identify which SIM or slot is making data connection active in mobile, we need to register action android:name="android.net.conn.CONNECTIVITY_CHANGE"  with permission   
uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL" &    uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

    public void onReceive(Context context, Intent intent) 
 if (android.net.conn.CONNECTIVITY_CHANGE.equalsIgnoreCase(intent
                .getAction())) {

IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
 IConnectivityManager service =  IConnectivityManager.Stub.asInterface(b);
NetworkState[] states = service.getAllNetworkState();

 for (NetworkState state : states) {

                if (state.networkInfo.getType() == ConnectivityManager.TYPE_MOBILE
                        && state.networkInfo.isConnected()) {

 TelephonyManager mTelephonyManager = (TelephonyManager) context
                        .getSystemService(Context.TELEPHONY_SERVICE);
         int slotList =  { 0, 1 };
          int[] subId = SubscriptionManager.getSubId(slotList[0]);
          if(mTelephonyManager.getDataEnabled(subId[0])) {
             // this means data connection is active for SIM1 similary you 
             //can chekc for SIM2 by slotList[1]
               .................
          }
}

}


Answer 10:

    ConnectivityManager cm = (ConnectivityManager) activity
                        .getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo info = cm.getActiveNetworkInfo();
                String networkType = "";
    if (info.getType() == ConnectivityManager.TYPE_WIFI) {
                    networkType = "WIFI";
                } 
else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {

                    networkType = "mobile";
    }


Answer 11:

根据Android文档https://developer.android.com/training/monitoring-device-state/connectivity-monitoring#java

ConnectivityManager cm =
     (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
                      activeNetwork.isConnectedOrConnecting();


Answer 12:

使用TelephonyManager

TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

tm.isDataEnabled()

据Android文档

https://developer.android.com/reference/android/telephony/TelephonyManager.html#isDataEnabled()



Answer 13:

下面是从其他两个答案一个简单的解决方案:

        TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            return tm.isDataEnabled();

        } else {
            return tm.getSimState() == TelephonyManager.SIM_STATE_READY && tm.getDataState() != TelephonyManager.DATA_DISCONNECTED;
        }


文章来源: How to tell if 'Mobile Network Data' is enabled or disabled (even when connected by WiFi)?