2015-04-08 3 views
0

В настоящее время я ищу конкретное решение для получения доступности сотовой сети. Для этого я хочу поделиться сценарием: Предположим, что я получаю сотовую связь, но соединение с данными отключено, в этом случае он должен дать мне положительный результат, но в то время как Я вышел из зоны покрытия или в режиме полета ВКЛ он должен вернуть значение false. Я пробовал несколько кодов из stackoverflow: Check Network connections in android и Check mobile network connectivity & What does NetworkInfo.State SUSPENDED indicate? но все же они не то, что я ищу. Мало кто из других кодов, я попытался это:Как проверить подключение к сотовой сети в android

public String getCellularState(Context context){ 

      if(mPhoneState!=null && mPhoneState.getState()==ServiceState.STATE_IN_SERVICE){ 
      return "Available"; 
     } 
     else{ 
      return "Not Available"; 
     } 
} 

, а также

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

, но не получил никакого успеха, пожалуйста, предложить правильный путь, а также не связывают это подключение данных

ответ

0

Проверьте этот метод (он возвращает true, если вы подключены к сети):

public static boolean checkConnectivity(Context ctx) { 
     boolean bConectado = false; 
     ConnectivityManager connec = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] redes = connec.getAllNetworkInfo(); 

     for (int i = 0; i < 2; i++) { 
      if (redes[i].getState() == NetworkInfo.State.CONNECTED) { 
       bConectado = true; 
      } 
     } 
     return bConectado; 
    } 

Я думаю, что это из другого сообщения из Stack Overflow, но я не помню ссылку.

Для просмотра, если у вас есть реальная связь, вы можете проверить его через пинг в Google DNS, например (How to Ping External IP from Java Android):

public static boolean executeCammand(){ 
     System.out.println(" executeCammand"); 
     Runtime runtime = Runtime.getRuntime(); 
     try 
     { 
      Process mIpAddrProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); 
      int mExitValue = mIpAddrProcess.waitFor(); 
      System.out.println(" mExitValue "+mExitValue); 
      if(mExitValue==0){ 
       return true; 
      }else{ 
       return false; 
      } 
     } 
     catch (InterruptedException ignore) 
     { 
      ignore.printStackTrace(); 
      System.out.println(" Exception:"+ignore); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
      System.out.println(" Exception:"+e); 
     } 
     return false; 
    } 

Но, на мой взгляд, это не самый лучший выбор.

0

Пожалуйста, проверьте следующее и изменять в соответствии с требованием:

public boolean getNetworkState() { 
    boolean network = false; 
    boolean data = false; 
    ConnectivityManager connectivity = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo[] infos = connectivity.getAllNetworkInfo(); 
    for (int i = 0; i < infos.length; i++) { 
     if(infos[i].isAvailable()){ 
      network = true; 
     } 
     if(infos[i].isConnected()){ 
      data = true; 
     } 
    } 

    if(network) 
     if(!data) 
      return true; 

    return false; 
} 

Если одна из сети присутствует и соединение данных не существует, то он возвращает истину иначе ложь. isAvailable вернет доступность сети, и isConnected вернет возможность подключения к данным.

0
/** 
* Checking whether internet connection is available or not using wifi as well as mobile data network. 
* 
* @param nContext 
* @return true if net connection is avaible otherwise false 
*/ 
public static boolean isNetworkAvailable(Context nContext) { 
    boolean isNetAvailable = false; 
    if (nContext != null) { 
     ConnectivityManager mConnectivityManager = (ConnectivityManager) nContext 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (mConnectivityManager != null) { 
      boolean mobileNetwork = false; 
      boolean wifiNetwork = false; 
      boolean mobileNetworkConnecetd = false; 
      boolean wifiNetworkConnecetd = false; 
      NetworkInfo mobileInfo = mConnectivityManager 
        .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
      NetworkInfo wifiInfo = mConnectivityManager 
        .getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
      if (mobileInfo != null) 
       mobileNetwork = mobileInfo.isAvailable(); 
      if (wifiInfo != null) 
       wifiNetwork = wifiInfo.isAvailable(); 
      if (wifiNetwork == true || mobileNetwork == true) { 
       if (mobileInfo != null) 
        mobileNetworkConnecetd = mobileInfo 
          .isConnectedOrConnecting(); 
       wifiNetworkConnecetd = wifiInfo.isConnectedOrConnecting(); 
      } 
      isNetAvailable = (mobileNetworkConnecetd || wifiNetworkConnecetd); 
     } 
    } 
    return isNetAvailable; 

} 
+0

только Sidenote: считают не пренебрегайте фигурные скобки вокруг if-операторы даже для простых. Читатель должен выяснить, правильно ли настроен ваш код или нет. – sschrass

+0

@SatelliteSD: Можете ли вы рассказать мне о своей заметке? я хочу сказать номер строки ... – Utsav

0

попробовать этот

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;}//here is change to take which we want 

} 
add these permissions in manifest file 

<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> 
Смежные вопросы