Android API 29-检查是否连接到蜂窝网络

时间:2019-07-24 11:34:51

标签: android android-connectivitymanager

我正在开发一个SMS应用程序,并且想要检查网络(蜂窝)连接。在API级别29中,检查连接需要使用ConnectivityManager.NetworkCallback。我所管理的是让“ onAvailable()”在网络可用时通知我。但是,这也会通知我它是否连接到WiFi(因此我无法发送短信,但如果WiFI连接,则onAvailable()会触发)。

我尝试了onCapabilitiesChanged().hasTransport(TRANSPORT_CELLULAR),但是如果我连接到WiFi,则报告为false。

我还想尝试hasCapability(NET_CAPABILITY_MMS),但这会通知是否可以使用MMS。我不清楚是否存在可以使用SMS而不使用MMS的场景/网络?我可以得到此报告false,因为网络不支持MMS,但仍然可以发送SMS吗?

检查蜂窝网络是否可用的正确方法是什么?

4 个答案:

答案 0 :(得分:0)

也许您可以尝试以下

Network activeNetwork = connectivityManager.getActiveNetwork();
NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);
boolean cellular = caps.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);

if(cellular){
   // do your stuff
}

答案 1 :(得分:0)

尝试使用以下代码检查设备是否已连接到互联网。

    ConnectivityManager conMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = conMgr.getActiveNetworkInfo();
    if (netInfo == null) {

        Toast.makeText(this, "Please turn on Internet ", Toast.LENGTH_SHORT).show();

    } else {
        //do what you want
    }

答案 2 :(得分:0)

您需要使用网络回调。

try {
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkRequest.Builder builder = new NetworkRequest.Builder();

    connectivityManager.registerNetworkCallback(builder.build(),new ConnectivityManager.NetworkCallback() {
                @Override
                public void onAvailable(Network network) {
                    Variables.isNetworkConnected = true; // Global Static Variable
                }
                @Override
                public void onLost(Network network) {
                    Variables.isNetworkConnected = false; // Global Static Variable
                }
            }

    );
    Variables.isNetworkConnected = false;
}catch (Exception e){
    Variables.isNetworkConnected = false;
}

Variables.isNetworkConnected -在这里,我使用了全局静态变量,因此可以使用它来访问应用程序的任何软件中的网络状态。

有关完整的代码实现,请参考this gist

答案 3 :(得分:0)

晚了,我不确定29岁...我觉得这很it脚...但这是我的做法:

public boolean isCellularAvailable()
{
    TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    String opetarorName = telephonyManager.getNetworkOperatorName();

    Log.i(LOG_TAG, "#### isCellularAvailable(): NetworkOperatorName is: " + opetarorName );

    if (opetarorName .compareTo("") == 0)
    {
        Log.i(LOG_TAG, "#### isCellularAvailable(): NOPE");
        Toast.makeText(context, "Turn off airplane mode and try again :)", Toast.LENGTH_LONG).show();
        return false;
    }
    else
    {
        Log.i(LOG_TAG, "#### isCellularAvailable(): YES!");
        return true;
    }
}

这里的想法是,如果您连接到蜂窝网络,则应该能够获得网络提供商的名称。

如果您获得一个名称,则说明您已连接到该网络,并且应该能够使用它。

如果您在飞行模式下,您将不会连接到网络,也不会获得名称。

请注意,文档中指出“结果在CDMA网络上可能不可靠”……无论如何。

但是“ telephonyManager”提供了一些类似的功能,例如如果您知道自己是有利的网络类型,则“ getNetworkType()”可能是另一种选择:

public boolean isCellularAvailable()
{
    TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
    int networkType = telephonyManager.getNetworkType();// .getNetworkOperatorName();

    Log.i(LOG_TAG, "#### isCellularAvailable(): Network type is: " + networkType);

    switch (networkType)
    {
        // Return true for networks that suits your purpose
        case TelephonyManager.NETWORK_TYPE_1xRTT:    return true;
        case TelephonyManager.NETWORK_TYPE_CDMA:     return true;
        case TelephonyManager.NETWORK_TYPE_EDGE:     return true;
        case TelephonyManager.NETWORK_TYPE_EHRPD:    return true;
        case TelephonyManager.NETWORK_TYPE_EVDO_0:   return true;
        case TelephonyManager.NETWORK_TYPE_EVDO_A:   return true;
        case TelephonyManager.NETWORK_TYPE_EVDO_B:   return true;
        case TelephonyManager.NETWORK_TYPE_GPRS:     return true;
        case TelephonyManager.NETWORK_TYPE_GSM:      return true;
        case TelephonyManager.NETWORK_TYPE_HSDPA:    return true;
        case TelephonyManager.NETWORK_TYPE_HSPA:     return true;
        case TelephonyManager.NETWORK_TYPE_HSPAP:    return true;
        case TelephonyManager.NETWORK_TYPE_HSUPA:    return true;
        case TelephonyManager.NETWORK_TYPE_IDEN:     return true;
        case TelephonyManager.NETWORK_TYPE_IWLAN:    return true;
        case TelephonyManager.NETWORK_TYPE_LTE:      return true;
        //case TelephonyManager.NETWORK_TYPE_NR:     return true;       // Not supported by my API
        case TelephonyManager.NETWORK_TYPE_TD_SCDMA: return true;
        case TelephonyManager.NETWORK_TYPE_UMTS:     return true;

        // Return false for unacceptable networks, UNKNOWN id no network e.g. airplane mode.
        case TelephonyManager.NETWORK_TYPE_UNKNOWN: return false;

        // Future unknown network types, handle as you please.
        default: return false;
    }