2012-03-05 4 views
149

Я хочу создать приложение, использующее Интернет, и я пытаюсь создать функцию, которая проверяет, доступно ли соединение, а если нет, перейдите к действию, в котором есть кнопка повтора и объяснение.Android check internet connection

Прикрепленный мой код до сих пор, но я получаю ошибку Syntax error, insert "}" to complete MethodBody.

Теперь я помещая их в попытке заставить его работать, но до сих пор не повезло ... Любая помощь не была бы оценена ,

public class TheEvoStikLeagueActivity extends Activity { 
    private final int SPLASH_DISPLAY_LENGHT = 3000; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 

     private boolean checkInternetConnection() { 
      ConnectivityManager conMgr = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE); 
      // ARE WE CONNECTED TO THE NET 
      if (conMgr.getActiveNetworkInfo() != null 
        && conMgr.getActiveNetworkInfo().isAvailable() 
        && conMgr.getActiveNetworkInfo().isConnected()) { 

       return true; 

       /* New Handler to start the Menu-Activity 
       * and close this Splash-Screen after some seconds.*/ 
       new Handler().postDelayed(new Runnable() { 
        public void run() { 
         /* Create an Intent that will start the Menu-Activity. */ 
         Intent mainIntent = new Intent(TheEvoStikLeagueActivity.this, IntroActivity.class); 
         TheEvoStikLeagueActivity.this.startActivity(mainIntent); 
         TheEvoStikLeagueActivity.this.finish(); 
        } 
       }, SPLASH_DISPLAY_LENGHT); 
      } else { 
       return false; 

       Intent connectionIntent = new Intent(TheEvoStikLeagueActivity.this, HomeActivity.class); 
       TheEvoStikLeagueActivity.this.startActivity(connectionIntent); 
       TheEvoStikLeagueActivity.this.finish(); 
      } 
     } 
    } 
+0

Отметьте этот ответ: http://stackoverflow.com/a/39766506/3806413 – 0xalihn

+0

Лучший ответ находится здесь http://stackoverflow.com/a/27312494/1708390. Просто выполните ping и посмотрите, действительно ли устройство подключено к Интернету. –

+0

Пожалуйста, проверьте этот ответ https://stackoverflow.com/a/44229355/6357366 –

ответ

294

Этот метод проверяет, подключен мобильный к Интернету и возвращает истину, если он подключен:

private boolean isNetworkConnected() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

    return cm.getActiveNetworkInfo() != null; 
} 

в манифесте ,

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

Редактировать: Этот метод фактически проверяет, подключено ли устройство к Интернету (возможно, он подключен к сети, но не к Интернету).

public boolean isInternetAvailable() { 
    try { 
     InetAddress ipAddr = InetAddress.getByName("google.com"); 
     //You can replace it with your name 
      return !ipAddr.equals(""); 

     } catch (Exception e) { 
      return false; 
    } 
} 
+0

привет Сешу спасибо ответ, как я могу заставить его перейти к другому действию, если он не обнаружит подключения к Интернету? – iamlukeyb

+0

Хеш то, что я сделал, но его все еще не будет в правильной деятельности, если (ni == null) { \t \t // Нет активных сетей. \t \t \t \t \t \t \t \t Намерения connectionIntent = новое Намерение (TheEvoStikLeagueActivity.this, InfoActivity.class); \t \t \t TheEvoStikLeagueActivity.this.startActivity (connectionIntent); TheEvoStikLeagueActivity.this.finish(); \t \t \t \t \t \t return false; \t \t \t \t \t \t} еще \t \t возвращение правда; \t \t} – iamlukeyb

+0

его заставка в тот момент, который длится 3 секунды, а затем переходит к интро-активности, но я хочу, чтобы он проверял подключение к Интернету раньше и предоставлял оператор if. если интернет подключен, тогда запустите всплеск, если не перейдите к другому действию.но на данный момент он просто пробегает всплеск и переходит к интро-активности. – iamlukeyb

14

Вы не можете создать метод внутри другого метода, перемещать private boolean checkInternetConnection() { метод из onCreate

+0

вы можете создать поток для непрерывного просмотра доступность сети и дать вам знать и продолжить повторную попытку после интервала. –

4

Попробуйте следующий код:

public static boolean isNetworkAvailable(Context context) { 
     boolean outcome = false; 

     if (context != null) { 
      ConnectivityManager cm = (ConnectivityManager) context 
        .getSystemService(Context.CONNECTIVITY_SERVICE); 

      NetworkInfo[] networkInfos = cm.getAllNetworkInfo(); 

      for (NetworkInfo tempNetworkInfo : networkInfos) { 


       /** 
       * Can also check if the user is in roaming 
       */ 
       if (tempNetworkInfo.isConnected()) { 
        outcome = true; 
        break; 
       } 
      } 
     } 

     return outcome; 
    } 
+0

heres то, что у меня есть до сих пор private boolean isNetworkConnected() { \t \t ConnectivityManager cm = (ConnectivityManager) getSystemService (Context.CONNECTIVITY_SERVICE); \t \t NetworkInfo ni = cm.getActiveNetworkInfo(); \t \t if (ni == null) { \t \t // Нет активных сетей. \t \t \t \t \t \t \t \t Намерения connectionIntent = новое Намерение (TheEvoStikLeagueActivity.this, InfoActivity.class); \t \t \t TheEvoStikLeagueActivity.this.startActivity (connectionIntent); TheEvoStikLeagueActivity.this.finish(); \t \t \t \t \t \t return false; \t \t \t \t \t \t} еще \t \t возвращение правда; \t \t} – iamlukeyb

+0

Пожалуйста, попробуйте часть кода, которую я отправил, чтобы проверить, может ли устройство подключаться к удаленному серверу или нет ... –

51

Проверьте, чтобы убедиться, что он «подключен» к сети:

public boolean isNetworkAvailable(Context context) { 
    final ConnectivityManager connectivityManager = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE)); 
    return connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected(); 
} 

Проверьте, чтобы убедиться, что он «подключен» к сети:

public boolean isInternetAvailable() { 
    try { 
     final InetAddress address = InetAddress.getByName("www.google.com"); 
     return !address.equals(""); 
    } catch (UnknownHostException e) { 
     // Log error 
    } 
    return false; 
} 

Необходимое разрешение:

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

https://stackoverflow.com/a/17583324/950427

+4

Как найти, связанный с Wi-Fi, но не фактические данные на Wi-Fi. –

+4

Указывает только, подключен ли к сети, а не к Интернету. Если вам нужны сбои (для безопасного интернет-кода), используйте это. –

+0

@ Подумал, что вы испортили введение в адский контекст –

2

После "возвращения" заявления, вы не можете писать код (за исключением примерочных, наконец, блок). Передвиньте новые коды активности перед операциями «return».

2
public boolean checkInternetConnection(Context context) { 
    ConnectivityManager connectivity = (ConnectivityManager) context 
     .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; 
} 
20

Вышеуказанные методы работают, когда вы подключены к источнику Wi-Fi или через пакеты сотового телефона. Но в случае подключения Wi-Fi есть случаи, когда вас просят войти в систему, как в кафе. Таким образом, в этом случае ваше приложение будет терпеть неудачу, поскольку вы подключены к источнику Wi-Fi, но не с Интернетом.

Этот метод работает нормально.

public static boolean isConnected(Context context) { 
     ConnectivityManager cm = (ConnectivityManager)context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    if (activeNetwork != null && activeNetwork.isConnected()) { 
     try { 
      URL url = new URL("http://www.google.com/"); 
      HttpURLConnection urlc = (HttpURLConnection)url.openConnection(); 
      urlc.setRequestProperty("User-Agent", "test"); 
      urlc.setRequestProperty("Connection", "close"); 
      urlc.setConnectTimeout(1000); // mTimeout is in seconds 
      urlc.connect(); 
      if (urlc.getResponseCode() == 200) { 
       return true; 
      } else { 
       return false; 
      } 
     } catch (IOException e) { 
      Log.i("warning", "Error checking internet connection", e); 
      return false; 
     } 
    } 

    return false; 

} 

Пожалуйста, используйте это в отдельном потоке от основного потока, как это делает сетевой вызов и выбросит NetwrokOnMainThreadException, если не последует.

А также не помещайте этот метод внутрь onCreate или любым другим способом. Поместите его внутри класса и получите доступ к нему.

+1

Это хороший подход к проблеме. Но, вероятно, достаточно пинга – dazito

1

Вот функция, я использую как часть моего Utils класса:

public static boolean isNetworkConnected(Context context) { 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    return (cm.getActiveNetworkInfo() != null) && cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
} 

использовать его как: Utils.isNetworkConnected(MainActivity.this);

+0

Предположим, что сеть все еще подключена, безопасно ли продолжить? –

+0

Зависит от вашего прецедента ... –

6

Нет необходимости быть сложным. Самый простой и рамочный способом является использование ACCESS_NETWORK_STATE разрешения и просто сделать связной метод

public boolean isOnline() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnectedOrConnecting(); 
} 

Вы также можете использовать requestRouteToHost, если у вас есть particualr хост и тип подключения (Wi-Fi/мобильный) в виде.

Вам также потребуется:

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

в андроид манифеста.

подробнее go here

+0

эта функция возвращает TRUE всегда –

+0

Это работает для меня. Эта ссылка может помочь. Http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts – Nepster

1

Это еще один вариант, чтобы обрабатывать все ситуации:.

public void isNetworkAvailable() { 
    ConnectivityManager connectivityManager = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) { 
    } else { 
     Toast.makeText(ctx, "Internet Connection Is Required", Toast.LENGTH_LONG).show(); 

    } 
} 
+0

ctx - это контекст, который должен быть глобальным. –

+0

Да, вы правы! Нам нужно определить его как глобальную переменную –

1

1- создать новый файл Java (щелкните правой кнопкой мыши пакет новый> Класс> имя файла ConnectionDetector.java

2- добавьте следующий код в файл

<pre>package <add you package name> example com.example.example; 

import android.content.Context; 
import android.net.ConnectivityManager; 

public class ConnectionDetector { 

    private Context mContext; 

    public ConnectionDetector(Context context){ 
     this.mContext = context; 
    } 

    public boolean isConnectingToInternet(){ 

     ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if(cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected() == true) 
     { 
      return true; 
     } 

     return false; 

    } 
} 

3- открыть ваш MainActivity.java - деятельность, где вы хотите, чтобы проверить соединение и сделать следующее

A- создать и определить функцию.

<pre>ConnectionDetector mConnectionDetector;</pre> 

B- внутри "OnCreate" добавить следующий

<pre>mConnectionDetector = new ConnectionDetector(getApplicationContext());</pre> 

c- для проверки соединения используйте следующие шаги

<pre> if (mConnectionDetector.isConnectingToInternet() == false) { 
//no connection- do something 
} else { 
//there is connection 
}</pre> 
3

в манифесте

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

в коде,

public static boolean isOnline(Context ctx) { 
    if (ctx == null) 
     return false; 

    ConnectivityManager cm = 
      (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
     return true; 
    } 
    return false; 
} 
2

Используйте этот код, чтобы проверить подключение к Интернету

ConnectivityManager connectivityManager = (ConnectivityManager) ctx 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     if ((connectivityManager 
       .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null && connectivityManager 
       .getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED) 
       || (connectivityManager 
         .getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null && connectivityManager 
         .getNetworkInfo(ConnectivityManager.TYPE_WIFI) 
         .getState() == NetworkInfo.State.CONNECTED)) { 
      return true; 
     } else { 
      return false; 
     } 
1

Проверка сети Доступен в Android с скоростью интернет-данных.

public boolean isConnectingToInternet(){ 
     ConnectivityManager connectivity = (ConnectivityManager) Login_Page.this.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) 
         { 
          try 
          { 
           HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection()); 
           urlc.setRequestProperty("User-Agent", "Test"); 
           urlc.setRequestProperty("Connection", "close"); 
           urlc.setConnectTimeout(500); //choose your own timeframe 
           urlc.setReadTimeout(500); //choose your own timeframe 
           urlc.connect(); 
           int networkcode2 = urlc.getResponseCode(); 
           return (urlc.getResponseCode() == 200); 
          } catch (IOException e) 
          { 
           return (false); //connectivity exists, but no internet. 
          } 
         } 

      } 
      return false; 
    } 

Эта функция возвращает истину или ложь. должны получить разрешения пользователя

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

Вы можете использовать следующий фрагмент кода для проверки подключения к Интернету.

Это будет полезно и так, что вы можете проверить, какой Тип сетевых Подключения доступно, так что вы можете сделать ваш процесс на этом пути.

Вам просто нужно скопировать следующий класс и вставить его непосредственно в свой пакет.

/** 
* 
* @author Pratik Butani 
* 
*/ 
public class InternetConnection { 

    /** CHECK WHETHER INTERNET CONNECTION IS AVAILABLE OR NOT */ 
    public static boolean checkConnection(Context context) { 
     final ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo activeNetworkInfo = connMgr.getActiveNetworkInfo(); 

     if (activeNetworkInfo != null) { // connected to the internet 
      Toast.makeText(context, activeNetworkInfo.getTypeName(), Toast.LENGTH_SHORT).show(); 

      if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
       // connected to wifi 
       return true; 
      } else if (activeNetworkInfo.getType() == ConnectivityManager.TYPE_MOBILE) { 
       // connected to the mobile provider's data plan 
       return true; 
      } 
     } 
     return false; 
    } 
} 

Теперь вы можете использовать как:

if (InternetConnection.checkConnection(context)) { 
    // Its Available... 
} else { 
    // Not Available... 
} 

НЕ ЗАБУДЬТЕ ВЗЯТЬ разрешение :) :)

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

Вы можете изменить основанные на вашем требовании.

Спасибо.

7

Все официальные методы только сообщают, открыта ли сеть для сети или нет,
Если ваше устройство подключено к Wi-Fi, но Wi-Fi не подключен к Интернету, этот метод не будет работать (что происходит много раз), нет встроенной сети метод обнаружения расскажет об этом сценарии, поэтому созданный класс асинхронный обратный вызов, который будет возвращать в onConnectionSuccess и onConnectionFail

 new CheckNetworkConnection(this, new CheckNetworkConnection.OnConnectionCallback() { 

      @Override 
      public void onConnectionSuccess() { 
    Toast.makeText(context, "onSuccess()", toast.LENGTH_SHORT).show(); 
      } 

      @Override 
      public void onConnectionFail(String msg) { 
    Toast.makeText(context, "onFail()", toast.LENGTH_SHORT).show(); 
      } 
     }).execute(); 

вызовов по сети с асинхронным Task

public class CheckNetworkConnection extends AsyncTask<Void, Void, Boolean> { 
private OnConnectionCallback onConnectionCallback; 
private Context context; 

public CheckNetworkConnection(Context con, OnConnectionCallback onConnectionCallback) { 
    super(); 
    this.onConnectionCallback = onConnectionCallback; 
    this.context = con; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
} 

@Override 
protected Boolean doInBackground(Void... params) { 
    if (context == null) 
     return false; 

    boolean isConnected = new NetWorkInfoUtility().isNetWorkAvailableNow(context); 
    return isConnected; 
} 

@Override 
protected void onPostExecute(Boolean b) { 
    super.onPostExecute(b); 

    if (b) { 
     onConnectionCallback.onConnectionSuccess(); 
    } else { 
     String msg = "No Internet Connection"; 
     if (context == null) 
      msg = "Context is null"; 
     onConnectionCallback.onConnectionFail(msg); 
    } 

} 

public interface OnConnectionCallback { 
    void onConnectionSuccess(); 

    void onConnectionFail(String errorMsg); 
} 
} 

Фактический класс, который будет свистеть на сервер

class NetWorkInfoUtility { 

public boolean isWifiEnable() { 
    return isWifiEnable; 
} 

public void setIsWifiEnable(boolean isWifiEnable) { 
    this.isWifiEnable = isWifiEnable; 
} 

public boolean isMobileNetworkAvailable() { 
    return isMobileNetworkAvailable; 
} 

public void setIsMobileNetworkAvailable(boolean isMobileNetworkAvailable) { 
    this.isMobileNetworkAvailable = isMobileNetworkAvailable; 
} 

private boolean isWifiEnable = false; 
private boolean isMobileNetworkAvailable = false; 

public boolean isNetWorkAvailableNow(Context context) { 
    boolean isNetworkAvailable = false; 

    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 

    setIsWifiEnable(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()); 
    setIsMobileNetworkAvailable(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected()); 

    if (isWifiEnable() || isMobileNetworkAvailable()) { 
     /*Sometime wifi is connected but service provider never connected to internet 
     so cross check one more time*/ 
     if (isOnline()) 
      isNetworkAvailable = true; 
    } 

    return isNetworkAvailable; 
} 

public boolean isOnline() { 
    /*Just to check Time delay*/ 
    long t = Calendar.getInstance().getTimeInMillis(); 

    Runtime runtime = Runtime.getRuntime(); 
    try { 
     /*Pinging to Google server*/ 
     Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); 
     int exitValue = ipProcess.waitFor(); 
     return (exitValue == 0); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } finally { 
     long t2 = Calendar.getInstance().getTimeInMillis(); 
     Log.i("NetWork check Time", (t2 - t) + ""); 
    } 
    return false; 
} 
} 
+0

Спасибо за подробную информацию о сети. –

31

Вы можете просто свистеть онлайн сайт как Google:

public boolean isConnected() throws InterruptedException, IOException 
{ 
    String command = "ping -c 1 google.com"; 
    return (Runtime.getRuntime().exec (command).waitFor() == 0); 
} 
+0

Спасибо за его работу для меня –

+0

правильный ответ. –

+2

Я думаю, что это самое умное решение –

13

принято отвечать отредактируем показывает как проверить, что-то на интерне t может быть достигнуто. Мне пришлось слишком долго ждать ответа, когда это было не так (с Wi-Fi, у которого нет подключения к Интернету). К сожалению, InetAddress.getByName не имеет параметр времени ожидания, поэтому следующий код работает вокруг, что:

private boolean internetConnectionAvailable(int timeOut) { 
    InetAddress inetAddress = null; 
    try { 
     Future<InetAddress> future = Executors.newSingleThreadExecutor().submit(new Callable<InetAddress>() { 
      @Override 
      public InetAddress call() { 
       try { 
        return InetAddress.getByName("google.com"); 
       } catch (UnknownHostException e) { 
        return null; 
       } 
      } 
     }); 
     inetAddress = future.get(timeOut, TimeUnit.MILLISECONDS); 
     future.cancel(true); 
    } catch (InterruptedException e) { 
    } catch (ExecutionException e) { 
    } catch (TimeoutException e) { 
    } 
    return inetAddress!=null && !inetAddress.equals(""); 
} 
+0

Спасибо, что это работает для меня :) –

+0

Это получилось неплохо для одной нечетной проверки, где мне не нужно управлять состоянием «достижимости». –

+0

Спасибо, это работает и для меня. – San

5

Используйте этот метод:

public static boolean isOnline() { 
    ConnectivityManager cm = (ConnectivityManager) context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
    return netInfo != null && netInfo.isConnectedOrConnecting(); 
} 

Это разрешение необходимо:

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

дублирует и неточно возвращает true с не-интернет-маршрутизацией –