Android API调用以确定用户设置的“数据启用”

8
我的程序试图检测特定位置是否有移动网络可用。
问题在于,当我没有数据连接时,并不意味着网络不存在......这取决于用户的偏好。有一些API可以使用,例如NetworkInfo.isAvailable()以及用户设置,例如用户是否漫游并启用漫游,或者飞行模式是否打开。
我的问题是,我无法确定用户是否在“设置/无线网络/移动网络”下禁用了数据服务。
听起来像是一个微不足道的问题,但我还没有找到对应的API调用。
2个回答

8

我在哪里可以找到所有可以传递给Setttings.Secure的字符串列表(例如“mobile_data”)? - gonzobrains
官方文档请参考这里这里。对于未记录或隐藏的设置,您需要查看core/java/android/provider/Settings.java的源代码,可以在这里查看。 - bmaupin
你好,有没有一种方法可以在设置更改时接收一些通知,然后才读取“mobile_data”? - ransh
@ransh 我不确定。无论如何,最好将其作为一个单独的问题来询问。 - bmaupin
@bmaupin 当我接收到WIFI禁用的通知时,它却返回false,但我的移动数据按钮已启用,为什么它仍然像你提到的那样工作呢? - Jeeva

1

我知道上面的答案对OP有效。但是在一些设备上,即使数据被禁用,它也会返回true。

所以我找到了一个替代方案,它在Android API中。

TelephonyManagergetDataState()方法将非常有用。

当蜂窝数据被禁用时,下面的函数返回false,否则返回true。

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;
    }

当您收到WiFi禁用的通知时,它不会给出精确的结果。 - Jeeva
1
即使移动数据已启用,它仍返回false。 - Jeeva
好的,它可以在所有设备上运行。有趣的是对于你不起作用的设备,请尝试其他答案。你使用的是什么设备? - MohK
1
@Mohammadhussain Khatri 我有红米3S Prime。 - Jeeva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接