检查可用移动网络的正确方法是什么(无数据连接)

时间:2011-06-22 06:36:56

标签: android

检查Android上的移动网络(GSM)连接是否正确的正确方法是什么? (> 2.1)我不想检查移动网络上是否有可用的数据连接,只检查网络可用性。 (检查是否可以通过移动网络拨打电话)

目前我正在使用以下支票:

public static boolean checkMobileNetworkAvailable(Context context){
    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    int networkType = tm.getNetworkType();
    return (networkType != TelephonyManager.NETWORK_TYPE_UNKNOWN);
}

但似乎有些设备总是报告“NETWORK_TYPE_UNKNOWN”。所以检查一直都失败了。

有更好的方法吗?

更新:

以下方法会更好吗?

    public static boolean checkMobileNetworkAvailable(Context context){
       boolean isMobileNetworkAvailable = false;
       ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
       NetworkInfo[] networks = cm.getAllNetworkInfo();
       for(int i=0;i<networks.length;i++){
        if(networks[i].getType() == ConnectivityManager.TYPE_MOBILE){
              if(networks[i].isAvailable()){
                isMobileNetworkAvailable = true;
              }
            }
        }

    return isMobileNetworkAvailable;
}

6 个答案:

答案 0 :(得分:8)

我使用以下代码来了解我是否已连接到网络(无移动数据):

    public static Boolean isMobileAvailable(Context appcontext) {       
    TelephonyManager tel = (TelephonyManager) appcontext.getSystemService(Context.TELEPHONY_SERVICE);       
    return ((tel.getNetworkOperator() != null && tel.getNetworkOperator().equals("")) ? false : true);      
}

仅当手机实际注册到网络时才会返回NetworkOperator。

答案 1 :(得分:4)

对我来说工作正常PhoneStateListener:

private static class YourListener extends PhoneStateListener {
    @Override
    public void onServiceStateChanged(ServiceState serviceState){           
        if (serviceState.getState() == ServiceState.STATE_IN_SERVICE) {
             // connected to cellular network
        }
    }       
}

在TelephonyManager中注册:

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
YourListener listener = new YourListener();
tm.listen(listener, PhoneStateListener.LISTEN_SERVICE_STATE);

在注册时,电话管理器调用侦听器对象上的onServiceChanged()方法并传递当前状态。

PS:PhoneStateListener使用Handler将结果发布到UI线程,因此您应该在UI线程中创建它。

答案 2 :(得分:2)

我使用以下方法检查android中网络连接的可用性。最好的是您可以按原样复制此方法,并可以使用它来检查网络连接。它会检查所有网络的连接,以确保是否连接了任何网络。

/**
 * Check the hardware if there are connected to Internet or not.
 * This method gets the list of all available networks and if any one of 
 * them is connected returns true. If none is connected returns false.
 * 
 * @param context {@link Context} of the app.
 * @return <code>true</code> if connected or <code>false</code> if not
 */
public static boolean isNetworkAvailable(Context context) {
    boolean available = false;
    try {
        ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        available = true;
                    }
                }
            }
        }
        if (available == false) {
            NetworkInfo wiMax = connectivity.getNetworkInfo(6);

            if (wiMax != null && wiMax.isConnected()) {
                available = true;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return available;
}

答案 3 :(得分:1)

查看我对Problem in detecting Internet Connection in Android的回答。

如果网络不可用或仍在连接,您可能会收到NETWORK_TYPE_UNKNOWN响应。

答案 4 :(得分:0)

我相信这可以胜任......

ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if (manager != null) {
            NetworkInfo info = manager.getActiveNetworkInfo();
            if (info != null && info.isConnected()) {
                networkAvailable = true;
            }

答案 5 :(得分:0)

我一直在寻找一种有效的解决方案,以了解设备是否可以访问移动网络(而非数据网络)。

维克多的答案是一个非常有效的解决方案:https://stackoverflow.com/a/6760761/11024162

如果仅在某个特定时刻需要服务状态,则可以在onServiceStateChanged回调中注销侦听器。像这样:

private inner class PhoneListener : PhoneStateListener(){
override fun onServiceStateChanged(serviceState: ServiceState?) {
    if (serviceState?.state != ServiceState.STATE_IN_SERVICE) {

        //Behavior when no mobile network

    }
    //unregister listener after one callback call
    //phoneListener is the PhoneListener you previously create to register listener
    val tel = requireContext().getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
    tel.listen(phoneListener, PhoneStateListener.LISTEN_NONE)
}

}