Kaip patikrinti interneto prieigą „Android“? „InetAddress“ niekada nesibaigia

Aš turiu AsyncTask , kuri turėtų patikrinti tinklo prieigą prie pagrindinio kompiuterio pavadinimo. Bet doInBackground() niekada nepertraukiamas. Ar kas nors turi raktą?

 public class HostAvailabilityTask extends AsyncTask<String, Void, Boolean> { private Main main; public HostAvailabilityTask(Main main) { this.main = main; } protected Boolean doInBackground(String... params) { Main.Log("doInBackground() isHostAvailable():"+params[0]); try { return InetAddress.getByName(params[0]).isReachable(30); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return false; } protected void onPostExecute(Boolean... result) { Main.Log("onPostExecute()"); if(result[0] == false) { main.setContentView(R.layout.splash); return; } main.continueAfterHostCheck(); } } 
586
13 окт. nustatė Vidar Vestnes spalio 13 d 2009-10-13 17:59 '09 17:59 2009-10-13 17:59
@ 50 atsakymų
  • 1
  • 2

Tinklo ryšys / interneto prieiga

  • isConnectedOrConnecting() (naudojamas daugelyje atsakymų) tikrina bet kurį tinklo ryšį
  • Jei norite sužinoti, ar bet kuris iš šių tinklų turi prieigą prie interneto , naudokite vieną iš šių būdų

A) Serveris (paprastas)

 // ICMP public boolean isOnline() { Runtime runtime = Runtime.getRuntime(); try { 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(); } return false; } 

+ gali dirbti pagrindine tema

- neveikia kai kuriuose senuose įrenginiuose (Galays S3 ir tt), jis tam tikrą laiką blokuoja, jei internetas nėra prieinamas.

B) Prisijunkite prie interneto lizdo (išplėstinė)

 // TCP/HTTP/DNS (depending on the port, 53=DNS, 80=HTTP, etc.) public boolean isOnline() { try { int timeoutMs = 1500; Socket sock = new Socket(); SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53); sock.connect(sockaddr, timeoutMs); sock.close(); return true; } catch (IOException e) { return false; } } 

+ labai greitai (vistiek), veikia visuose įrenginiuose, labai patikimas

- negali dirbti vartotojo sąsajos sraute

Jis veikia labai patikimai, kiekviename įrenginyje ir labai greitai. Ji turėtų veikti atskiroje užduotyje (pvz., ScheduledExecutorService arba AsyncTask ).

Galimi klausimai

  • Ar tai tikrai pakankamai greita?

    Taip, labai greitai ;-)

  • Ar yra patikimas būdas išbandyti internetą, išskyrus ką nors išbandyti internete?

    Ne kiek aš žinau, bet leiskite man žinoti, ir aš redaguosiu savo atsakymą.

  • Ką daryti, jei DNS neveikia?

    „Google DNS“ (pvz., 8.8.8.8 ) yra didžiausias viešasis DNS visame pasaulyje. Nuo 2013 m. Jis aptarnauja 130 milijardų prašymų per dieną. Leiskite tik pasakyti, kad jūsų programa greičiausiai nekalbės apie apačią.

  • Kokie leidimai reikalingi?

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

    Tiesiog prieigą prie interneto yra nustebinti ^ ^ (Beje, ar jūs kada nors susimąstėte, kaip kai kurie čia siūlomi metodai netgi gali turėti nuotolinį klijus interneto prieigai be šio leidimo?)

Išplėstinė: vieno smūgio pavyzdys su „ AsyncTask

 class InternetCheck extends AsyncTask<Void,Void,Boolean> { private Consumer mConsumer; public interface Consumer { void accept(Boolean internet); } public InternetCheck(Consumer consumer) { mConsumer = consumer; execute(); } @Override protected Boolean doInBackground(Void... voids) { try { Socket sock = new Socket(); sock.connect(new InetSocketAddress("8.8.8.8", 53), 1500); sock.close(); return true; } catch (IOException e) { return false; } } @Override protected void onPostExecute(Boolean internet) { mConsumer.accept(internet); } } /////////////////////////////////////////////////////////////////////////////////// // Usage new InternetCheck(internet -> {  }); 

Neprivaloma: RxJava/RxAndroid pavyzdys RxJava/RxAndroid (Kotlin)

 fun hasInternetConnection(): Single<Boolean> { return Single.fromCallable { try { // Connect to Google DNS to check for connection val timeoutMs = 1500 val socket = Socket() val socketAddress = InetSocketAddress("8.8.8.8", 53) socket.connect(socketAddress, timeoutMs) socket.close() true } catch (e: IOException) { false } } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) } /////////////////////////////////////////////////////////////////////////////////// // Usage hasInternetConnection().subscribe { hasInternet -> } 
403
05 дек. Levit atsakė į 05 gruodį 2014-12-05 12:20 '14, 12:20 2014-12-05 12:20

Jei prietaisas yra lėktuvo režimu (arba, manoma, kitose situacijose, kai nėra tinklo), cm.getActiveNetworkInfo() bus null , taigi jums reikia pridėti null patikrinimą.

Modifikuotas sprendimas ( Eddie ):

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

AndroidManifest.xml taip pat pridėkite šias teises:

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

Kitas nedidelis taškas, jei būtinai turite prisijungti prie tinklo šiuo metu, tai geriau naudoti netInfo.isConnected() ir ne netInfo.isConnectedOrConnecting . Manau, tai priklauso nuo konkretaus naudojimo atvejo.

1007
24 окт. atsakymas duotas gar 24 d. 2010-10-24 19:28 '10, 19:28, 2010-10-24 19:28

Nereikia būti sudėtinga. Paprasčiausias ir skeleto būdas yra naudoti ACCESS_NETWORK_STATE leidimą ir tiesiog prijungti metodą

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

Taip pat galite naudoti requestRouteToHost jei turite tam tikrą kompiuterio ir ryšio tipą (wifi / mobilusis).

Jums taip pat reikės:

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

„Android“ manifeste.

290
04 янв. atsakymą pateikė eddie Jan 04 2010-01-04 23:01 '10 at 11:01 PM 2010-01-04 23:01

Norėdami gauti getActiveNetworkInfo() darbą, į manifestą turite pridėti toliau pateiktą informaciją.

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
63
27 сент. atsakymas pateikiamas azelez 27 sep . 2010-09-27 13:05 '10, 13:05, 2010-09-27 13:05

patikrinkite šį kodą ... jis dirbo man :)

 public static void isNetworkAvailable(final Handler handler, final int timeout) { // ask fo message '0' (not connected) or '1' (connected) on 'handler' // the answer must be send before before within the 'timeout' (in milliseconds) new Thread() { private boolean responded = false; @Override public void run() { // set 'responded' to TRUE if is able to connect with google mobile (responds fast) new Thread() { @Override public void run() { HttpGet requestForTest = new HttpGet("http://m.google.com"); try { new DefaultHttpClient().execute(requestForTest); // can last... responded = true; } catch (Exception e) { } } }.start(); try { int waited = 0; while(!responded  (waited < timeout)) { sleep(100); if(!responded ) { waited += 100; } } } catch(InterruptedException e) {} // do nothing finally { if (!responded) { handler.sendEmptyMessage(0); } else { handler.sendEmptyMessage(1); } } } }.start(); } 

Tada aš apibrėžiu tvarkytoją:

 Handler h = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what != 1) { // code if not connected } else { // code if connected } } }; 

... ir paleiskite testą:

 isNetworkAvailable(h,2000); // get the answser within 2000 ms 
47
27 апр. Gilbou atsakė 27 balandžio. 2011-04-27 14:41 '11 at 14:41 2011-04-27 14:41

Pažvelkite į „ConnectivityManager“ klasę. Šią klasę galite naudoti norėdami gauti informaciją apie aktyvius ryšius priimančioje vietoje. http://developer.android.com/reference/android/net/ConnectivityManager.html

EDIT: galite naudoti

 Context.getSystemService(Context.CONNECTIVITY_SERVICE) .getNetworkInfo(ConnectivityManager.TYPE_MOBILE) 

arba

 Context.getSystemService(Context.CONNECTIVITY_SERVICE) .getNetworkInfo(ConnectivityManager.TYPE_WIFI) 

ir išanalizuoti grąžinamo „NetworkInfo“ objekto išsamią statistiką

Redaguoti EDIT: Norėdami sužinoti, ar galite pasiekti prieglobą, galite naudoti

 Context.getSystemService(Context.CONNECTIVITY_SERVICE) .requestRouteToHost(TYPE_WIFI, int hostAddress) 

Akivaizdu, kad naudoju Context.getSystemService (Context.CONNECTIVITY_SERVICE) kaip tarpinį serverį, kad pasakyti

 ConnectivityManager cm = Context.getSystemService(Context.CONNECTIVITY_SERVICE); cm.yourMethodCallHere(); 
45
13 окт. Atsakymą pateikė Chinmay Kanchi spalio 13 d. 2009-10-13 18:38 '09, 18:38 PM 2009-10-13 18:38

Rasta ir modifikuota (!) Iš šios nuorodos :

Į manifesto failą pridėkite bent:

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

Tikriausiai jau turite prieigą prie INTERNETO leidimo. Tada loginė funkcija, leidžianti išbandyti ryšį:

 private boolean checkInternetConnection() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // test for connection if (cm.getActiveNetworkInfo() != null  cm.getActiveNetworkInfo().isAvailable()  cm.getActiveNetworkInfo().isConnected()) { return true; } else { Log.v(TAG, "Internet Connection Not Present"); return false; } } 
25
11 янв. Atsakymą pateikė Ajhar sausio 11 d. 2011-01-11 13:29 „11 at 13:29 pm“ 2011-01-11 13:29

Aš padariau šį kodą, tai paprasčiausias, ir tai tiesiog logiška. nurodant, if(isOnline()){

Jūs gaunate, jei yra ryšys, ir jei jis gali prisijungti prie puslapio, būsenos kodas yra 200 (stabilus ryšys).

Būtinai pridėkite teisingus INTERNET ir ACCESS_NETWORK_STATE .

 public boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); if (netInfo != null  netInfo.isConnected()) { try { URL url = new URL("http://www.google.com"); HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); urlc.setConnectTimeout(3000); urlc.connect(); if (urlc.getResponseCode() == 200) { return new Boolean(true); } } catch (MalformedURLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return false; } 
15
19 июля '12 в 16:27 2012-07-19 16:27 Atsakymą pateikia „ Android.Thirio.nl“, liepos 19, 12, 16:27 2012-07-19 16:27

Jis veikia man:

Jei norite patikrinti tinklo prieinamumą:

 private Boolean isNetworkAvailable() { ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null  activeNetworkInfo.isConnectedOrConnecting();} 

Jei norite patikrinti interneto prieigą:

 public Boolean isOnline() { try { Process p1 = java.> 
12
07 марта '14 в 19:57 2014-03-07 19:57 Atsakymą Musculaa teikia kovo 7 d. 14 d. 19:57 2014-03-07 19:57

Iš visų, ką iki šiol mačiau, trumpiausias ir švariausias būdas:

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

PS: ji nekontroliuoja jokio kompiuterio, tik patikrina ryšio būseną, todėl, jei jūsų maršrutizatorius nėra prijungtas prie interneto ir jūsų įrenginys prijungtas prie jo, šis metodas bus teisingas , nors neturite interneto.
Jei norite atlikti tikrąjį testą, rekomenduoju įvykdyti „HttpHead“ užklausą (pvz., Www.google.com) ir patikrinti būseną, jei jos 200 OK yra gerai ir jūsų įrenginys turi interneto ryšį.

8
19 сент. Atsakymas pateikiamas Nickolaus rugsėjo 19 d 2012-09-19 11:10 '12, 11:10 am 2012-09-19 11:10

Vienas iš svarbiausių mobiliųjų įrenginių naudojimo būdų yra tikrasis ryšys. Tai yra dažna problema, kai mobilusis vartotojas prisijungia prie „Wifi“ tinklo su „Captive Portal“, kuriame jie turi prisijungti. Šį užrakinimo funkciją naudoju fone, kad užtikrintumėte ryšį.

  public boolean checkConnectionHttps(String url){ boolean responded = false; HttpGet requestTest = new HttpGet(url); HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 3000); HttpConnectionParams.setSoTimeout(params, 5000); DefaultHttpClient client = new DefaultHttpClient(params); try { client.execute(requestTest); responded = true; } catch (ClientProtocolException e) { Log.w(MainActivity.TAG,"Unable to connect to " + url + " " + e.toString()); } catch (IOException e) { Log.w(MainActivity.TAG,"Unable to connect to " + url + " " + e.toString()); e.printStackTrace(); } return responded; } 
7
13 июня '13 в 19:36 2013-06-13 19:36 atsakymą pateikė vartotojo1528493 birželio 13 d. 19:36 2013-06-13 19:36

Yra daugiau nei vienas būdas

Pirma, trumpiausias, bet neefektyvus būdas

Tik tinklo leidimas

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

Tada šis metodas

  public boolean activeNetwork () { ConnectivityManager cm = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null  activeNetwork.isConnected(); return isConnected; } 

Kaip matote iš atsakymų, „ ConnectivityManager yra sprendimas, ką tik pridėjau prie metodo, kuris yra supaprastintas metodas.
ConnectivityManager grąžina teisingumą, jei yra prieiga prie tinklo, o ne interneto prieiga, reiškia, kad „WiFi“ yra prijungtas prie maršrutizatoriaus, tačiau maršrutizatorius neturi interneto, jis grįžta teisingai, patikrina ryšį

Antra, veiksmingas būdas

Reikalauti tinklo ir interneto prieigos teisių

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

Tada ši klasė

  public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> { private Context context; public CheckInternetAsyncTask(Context context) { this.context = context; } @Override protected Boolean doInBackground(Void... params) { ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); assert cm != null; NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isConnected = activeNetwork != null  activeNetwork.isConnected(); if (isConnected) { try { HttpURLConnection urlc = (HttpURLConnection) (new URL("http://clients3.google.com/generate_204") .openConnection()); urlc.setRequestProperty("User-Agent", "Android"); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(1500); urlc.connect(); if (urlc.getResponseCode() == 204  urlc.getContentLength() == 0) return true; } catch (IOException e) { Log.e("TAG", "Error checking internet connection", e); return false; } } else { Log.d("TAG", "No network available!"); return false; } return null; } @Override protected void onPostExecute(Boolean result) { super.onPostExecute(result); Log.d("TAG", "result" + result); if(result){ // do ur code } } } 

Skambinkite „ CheckInternetAsyncTask

 new CheckInternetAsyncTask(getApplicationContext()).execute(); 

Kai kurie paaiškinimai: -

  • jums reikia patikrinti „ AsyncTask “ internetą, kitaip jis gali mesti „ AsyncTask kai kuriais atvejais

  • ConnectivityManager naudojamas patikrinti prieigą prie tinklo, jei tiesa siunčia užklausą („Ping“)

  • Išsiųsti užklausą http://clients3.google.com/generate_204 , žinoma, kad šis gerai žinomas URL grąžina tuščią puslapį su HTTP būsena 204, kuris yra greitesnis ir efektyvesnis nei http://www.google.com , skaityti tai yra jei turite svetainę, ji pageidauja vietoj „Google“ patalpinti jūsų svetainę, tik jei ją naudojate programoje

  • Laikotarpis gali būti pakeistas diapazone (20 ms → 2000 ms), paprastai naudojamas 1500 ms

7
26 дек. Atsakymą pateikė Mohamed Embaby 26 d. 2017-12-26 03:51 '17 at 3:51 2017-12-26 03:51

Čia yra būdas, kurį naudoju:

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

Dar geriau, įsitikinkite, kad jis prijungtas:

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

Štai kaip naudoti šį metodą:

 if (isNetworkAvailable(context)) { // code here } else { // code } 

Reikalingas leidimas:

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

ngn-wiki.ru.site/questions/13931 / ...

7
11 июля '13 в 3:50 2013-07-11 03:50 atsakymą pateikė Jaredas Burrowsas liepos 13 d., 13 val

Man tai nebuvo geras ryšių būsenos patikrinimas veiklos klasėje, nes

 ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

turėtumėte paskambinti ten, arba turite spustelėti ryšių tvarkytojo klasėje esantį veiklos pavyzdį, kad patikrintumėte ryšio būseną. Kai nėra wifi, prieinamas tinklo ryšys, aš sužinosiu „UnknownHostException“ išimtį:

 JSONObject jObj = null; Boolean responded = false; HttpGet requestForTest = new HttpGet("http://myserver.com"); try { new DefaultHttpClient().execute(requestForTest); responded = true; } catch (UnknownHostException e) { jObj = new JSONObject(); try { jObj.put("answer_code", 1); jObj.put("answer_text", "No available connection"); } catch (Exception e1) {} return jObj; } catch (IOException e) { e.printStackTrace(); } 

Taigi, galiu tvarkyti šią bylą kartu su kitais tos pačios klasės atvejais (mano serveris visada grąžina atsakymą naudodamas „Json“ eilutę)

6
25 нояб. atsakymą pateikė HiB . 2012-11-25 14:59 '12, 12:59 pm 2012-11-25 14:59

Galite kartoti per visus tinklo ryšius ir patikrinti, ar yra bent vienas prieinamas ryšys:

 public boolean isConnected() { boolean connected = false; ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); if (cm != null) { NetworkInfo[] netInfo = cm.getAllNetworkInfo(); for (NetworkInfo ni : netInfo) { if ((ni.getTypeName().equalsIgnoreCase("WIFI") || ni.getTypeName().equalsIgnoreCase("MOBILE"))  ni.isConnected()  ni.isAvailable()) { connected = true; } } } return connected; } 
6
13 февр. Atsakymą pateikė Emre Yazici vasario 13 d. 2012-02-13 10:34 '12, 10:34 2012-02-13 10:34

Jis veikia man. Išbandykite.

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); try { URL url = new URL("http://stackoverflow.com/posts/11642475/edit" ); //URL url = new URL("http://www.nofoundwebsite.com/" ); executeReq(url); Toast.makeText(getApplicationContext(), "Webpage is available!", Toast.LENGTH_SHORT).show(); } catch(Exception e) { Toast.makeText(getApplicationContext(), "oops! webpage is not available!", Toast.LENGTH_SHORT).show(); } } private void executeReq(URL urlObject) throws IOException { HttpURLConnection conn = null; conn = (HttpURLConnection) urlObject.openConnection(); conn.setReadTimeout(30000);//milliseconds conn.setConnectTimeout(3500);//milliseconds conn.setRequestMethod("GET"); conn.setDoInput(true); // Start connect conn.connect(); InputStream response =conn.getInputStream(); Log.d("Response:", response.toString()); }} 
6
25 июля '12 в 6:56 2012-07-25 06:56 atsakymą pateikė selva_pollachi , liepos 25 d. 12 val. 6:56 2012-07-25 06:56

Sunku patikrinti prisijungimo prie interneto / interneto būseną. Žemiau DetectConnection klasės padės jums patikrinti šią būseną:

 import android.content.Context; import android.net.ConnectivityManager; public class DetectConnection { public static boolean checkInternetConnection(Context context) { ConnectivityManager con_manager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (con_manager.getActiveNetworkInfo() != null  con_manager.getActiveNetworkInfo().isAvailable()  con_manager.getActiveNetworkInfo().isConnected()) { return true; } else { return false; } } } 

Skaityti daugiau Kaip patikrinti tinklo „Android“ / interneto būseną

5
18 июля '12 в 20:06 2012-07-18 20:06 atsakymą pateikė JSupport liepos 18 d. 12 d. 20:06 2012-07-18 20:06

Šis metodas gali būti naudojamas nustatyti tinklo prieinamumą -

 public static boolean isDeviceOnline(Context context) { boolean isConnectionAvail = false; try { ConnectivityManager cm = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); return netInfo.isConnected(); } catch (Exception e) { e.printStackTrace(); } return isConnectionAvail; } 
5
04 февр. Atsakymą pateikė Akshay Paliwal 04 vasaris. 2015-02-04 11:21 '15 at 11:21 AM 2015-02-04 11:21

Naudoju šį kodą vietoj „InetAddress“:

  try { URL url = new URL("http://"+params[0]); HttpURLConnection urlc = (HttpURLConnection) url.openConnection(); urlc.setRequestProperty("User-Agent", "Android Application:"+Z.APP_VERSION); urlc.setRequestProperty("Connection", "close"); urlc.setConnectTimeout(1000 * 30); // mTimeout is in seconds urlc.connect(); if (urlc.getResponseCode() == 200) { Main.Log("getResponseCode == 200"); return new Boolean(true); } } catch (MalformedURLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } 
5
13 окт. atsakymas į Vidar Vestnes spalio 13 d 2009-10-13 19:08 '09, 19:08, 2009-10-13 19:08
 public class Network { Context context; public Network(Context context){ this.context = context; } public boolean isOnline() { ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null  activeNetwork.isConnectedOrConnecting(); } } 
5
24 окт. vartotojo2912903 atsakymas 24 okt. 2013-10-24 18:42 '13, 06:42 pm 2013-10-24 18:42

Taikiau „@Levit“ pateiktą sprendimą ir sukūriau funkciją, kuri nesukels papildomo „Http“ užklausos.

Jis išspręs Unable to Resolve Host klaidos Unable to Resolve Host

 public static boolean isInternetAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); if (activeNetwork == null) return false; switch (activeNetwork.getType()) { case ConnectivityManager.TYPE_WIFI: if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED || activeNetwork.getState() == NetworkInfo.State.CONNECTING)  isInternet()) return true; break; case ConnectivityManager.TYPE_MOBILE: if ((activeNetwork.getState() == NetworkInfo.State.CONNECTED || activeNetwork.getState() == NetworkInfo.State.CONNECTING)  isInternet()) return true; break; default: return false; } return false; } private static boolean isInternet() { Runtime runtime = Runtime.getRuntime(); try { Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); int exitValue = ipProcess.waitFor(); Debug.i(exitValue + ""); return (exitValue == 0); } catch (IOException | InterruptedException e) { e.printStackTrace(); } return false; } 

Dabar pavadinkite jį

 if (!isInternetAvailable(getActivity())) { //Show message } else { //Perfoem the api request } 
5
09 янв. Atsakymą pateikė Jaymin Panchal 09 sausis 2017-01-09 09:57 '17 at 9:57 2017-01-09 09:57

Žemiau pateikiamas mano Utils klasės kodas:

 public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); return activeNetworkInfo != null  activeNetworkInfo.isConnected(); } 
5
11 июня '13 в 12:22 2013-06-11 12:22 atsakymą pateikė Mahendra Liya , birželio 11 d. 13 val. 12:22 2013-06-11 12:22

Geriausias būdas:

 public static boolean isOnline() { try { InetAddress.getByName("google.com").isReachable(3); return true; } catch (UnknownHostException e){ return false; } catch (IOException e){ return false; } } 
5
27 янв. Atsakymą pateikė Lo Juego Jan 27 2013-01-27 14:12 '13, 14:12, 2013-01-27 14:12

Kiti atsakymai, naudojantys „ConnectivityManager“, yra neteisingi, nes tinklo ryšys nereiškia, kad turite prieigą prie interneto. Pavyzdžiui, vartotojas gali prisijungti prie kavos virimo aparato, bet negali prisijungti prie interneto. Norėdami patikrinti interneto prieinamumą, turite pabandyti prisijungti prie realaus serverio. Paprastai, kai norite tai padaryti, turite tam tikrą serverį, prie kurio norite prisijungti, todėl eikite į priekį ir pažiūrėkite, ar galite prisijungti prie to serverio. Čia yra paprastas būdas patikrinti ryšį su serveriu.

 private boolean isOnTheInternet() { try { URLConnection urlConnection = new URL("http://yourserver").openConnection(); urlConnection.setConnectTimeout(400); urlConnection.connect(); return true; } catch (Exception e) { return false; } } 

„ConnectTimeout“ konfigūravimo priežastis yra ta, kad kitaip numatytasis laikas yra TCP, kuris gali užtrukti kelias sekundes.

Atkreipkite dėmesį, kad „Android“ neleis jums paleisti jo pagrindiniame gijos.

4
31 янв. atsakymas pateikiamas miguel sausio 31 d 2014-01-31 05:55 '14 at 5:55 2014-01-31 05:55

Šis metodas suteikia jums galimybę atlikti labai greitą metodą (grįžtamąjį ryšį realiuoju laiku) arba lėčiau (vienkartiniams patikrinimams, kuriems reikia patikimumo)

 public boolean isNetworkAvailable(bool SlowButMoreReliable) { bool Result = false; try { if(SlowButMoreReliable){ ConnectivityManager MyConnectivityManager = null; MyConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo MyNetworkInfo = null; MyNetworkInfo = MyConnectivityManager.getActiveNetworkInfo(); Result = MyNetworkInfo != null  MyNetworkInfo.isConnected(); } else { Runtime runtime = Runtime.getRuntime(); Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); int i = ipProcess.waitFor(); Result = i== 0; } } catch(Exception ex) { //Common.Exception(ex); //This method is one you should have that displays exceptions in your log } return Result; } 
4
05 марта '14 в 19:44 2014-03-05 19:44 Knickerless-Noggins atsakymas kovo 05 '14, 19:44 2014-03-05 19:44
4
16 марта '15 в 18:42 2015-03-16 18:42 Atsakymą pateikė Krekeris kovo 16 d., 15 val. 18:42 2015-03-16 18:42

Nuvažiavau visus atsakymus, ir aš atėjau savo atsakymą, kuris pirmiausia patikrina, ar internetas yra prieinamas ir ar yra internetas, ir patikrina, ar jis yra aktyvus, ar ne.

Įtraukiau visus būtinus metodus ir klases, kad patikrintumėte aktyvų interneto ryšį.

NetworkUtils.class

 public class NetworkUtils { public static final int STATUS_CONNECTED = 0 ; public static boolean isInternetAvailable(Context ctx){ ConnectivityManager cm = (ConnectivityManager)ctx.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null  activeNetwork.isConnectedOrConnecting(); } public static int isInternetActiveWithPing() { try { Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("/system/bin/ping -c 1 8.8.8.8"); int exitValue = process.waitFor(); return exitValue; } catch (Exception ex) { return -1; } } public static boolean isInternetActiveWithInetAddress() { try { InetAddress inetAddress = InetAddress.getByName("www.google.com"); return inetAddress != null  !inetAddress.toString().equals(""); } catch (Exception ex) { return false; } } public static void displayInternetConnectionMessage(Context ctx){ Toast.makeText(ctx, "Check Internet Connection", Toast.LENGTH_SHORT).show(); } }