【问题标题】:Checking Mobile Network connectivity in android在android中检查移动网络连接
【发布时间】:2013-11-11 11:43:50
【问题描述】:

如何在android手机中检查网络是否连接..(网络意味着不是互联网连接或数据连接它的简单移动网络如AIRTEL,CELLONE,VODAFONE等。)

我尝试使用 ConnectivityManager.TYPE_MOBILE 和 ConnectivityManager.TYPE_WIFI 但它们用于检查数据连接......而不是网络连接

【问题讨论】:

标签: android android-networking


【解决方案1】:

您可以使用TelephonyManager's getSimOperator()

【讨论】:

    【解决方案2】:
    public static boolean isNetworkAvailable(Activity activity) {
        ConnectivityManager connectivity = (ConnectivityManager) activity
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity == null)
        {
            return false;
        } else {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) 
                    {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    

    您应该将此权限添加到清单文件

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    【讨论】:

    • 他写道“网络意味着不是互联网连接或数据连接”。他不是在询问互联网连接。只需简单连接到网络,这意味着他可以拨打和接听电话
    【解决方案3】:

    试试这个:

    public class ConnectionDetector {
        private static Context _context;
    
        public ConnectionDetector(Context context){
            this._context = context;
        }
    
        public static boolean isConnectingToInternet(){ boolean haveConnectedWifi = false;
            boolean haveConnectedMobile = false;
    
            ConnectivityManager cm = (ConnectivityManager)_context.getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo[] netInfo = cm.getAllNetworkInfo();
            for (NetworkInfo ni : netInfo) {
                if (ni.getTypeName().equalsIgnoreCase("WIFI"))
                    if (ni.isConnected())
                        haveConnectedWifi = true;
                if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
                    if (ni.isConnected())
                        haveConnectedMobile = true;
            }
            return haveConnectedWifi || haveConnectedMobile;}
    
    }
    

    在清单文件中添加这些权限

    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
    

    【讨论】:

    • 但他写道“网络意味着不是互联网连接或数据连接”。他不是在问互联网连接。只需简单连接到网络,这意味着他可以拨打和接听电话
    【解决方案4】:

    根据Android Docs

    getSimOperator()

    返回 SIM 提供商的 MCC+MNC(移动国家代码 + 移动网络代码)。

    例如从 SIM 卡获取运营商 ID(MNC+MCC)

     public String getOperator()
           {
                TelephonyManager manager = (TelephonyManager) mGap.getSystemService(Context.TELEPHONY_SERVICE);
                String operatorName = manager.getSimOperator();
                return operatorName; 
           }
    

    【讨论】:

      【解决方案5】:

      为了查看状态,有两种方式:

      1. ServiceState 常量:STATE_EMERGENCY_ONLY、STATE_IN_SERVICE、STATE_OUT_OF_SERVICE、STATE_POWER_OFF。

      您可以致电telephonyManager.serviceState.state 获得。 如果您想收听更改,请致电 telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE) 使用 PhoneStateListener。要取消注册,请致电telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE)

      这是一个很好的解决方案,因为即使您没有 SIM 卡,有时(在某些国家/地区)您仍然可以拨打紧急电话号码,例如警察。

      enum class PhoneServiceState {
          STATE_EMERGENCY_ONLY, STATE_IN_SERVICE, STATE_OUT_OF_SERVICE, STATE_POWER_OFF, UNKNOWN;
      
          companion object {
              fun getFromValue(value: Int): PhoneServiceState = when (value) {
                  ServiceState.STATE_EMERGENCY_ONLY -> STATE_EMERGENCY_ONLY
                  ServiceState.STATE_IN_SERVICE -> STATE_IN_SERVICE
                  ServiceState.STATE_OUT_OF_SERVICE -> STATE_OUT_OF_SERVICE
                  ServiceState.STATE_POWER_OFF -> STATE_POWER_OFF
                  else -> UNKNOWN
              }
          }
      }
      

      用法:

      PhoneServiceState.getFromValue(telephonyManager!!.serviceState.state)
      

      如果是STATE_OUT_OF_SERVICE或STATE_POWER_OFF,则表示完全断开连接。如果您有 STATE_EMERGENCY_ONLY,则表示您只能拨打紧急电话。

      1. 您可以使用 subscriptionManager.activeSubscriptionInfoList 。如果您得到一个非空列表,我认为这意味着您已连接:

        fun hasCellConnection(context: Context): Boolean {
            val subscriptionManager = context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
            val activeSubscriptionInfoList = subscriptionManager.activeSubscriptionInfoList
            return !activeSubscriptionInfoList.isNullOrEmpty()
        }
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        相关资源
        最近更新 更多