2015-04-22 15 views
8

Właśnie stworzyłem aplikację na Androida do pobierania danych ze strony internetowej. Chcę sprawdzić, czy urządzenie ma połączenie z Internetem, czy nie. Jeśli urządzenie ma połączenie z Internetem, uruchom mój kod i pobierz dane i wyświetl je, w przeciwnym razie, jeśli urządzenie nie ma internetu, a następnie wyświetla komunikat o braku połączenia z Internetem. Próbowałem tego kodu, aby sprawdzić połączenie internetowe. Jak mogę połączyć się z kodem, gdy jest połączenie internetowe? Kodotwórz aplikację na Androida, gdy jest włączone połączenie z Internetem, inaczej nie wyświetlaj komunikatu o połączeniu z Internetem

My Java:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_primary); 
     new FetchWebsiteData().execute();   
      } 
     }); 

    } 

    private class FetchWebsiteData extends AsyncTask<Void, Void, String[]> { 
     String websiteTitle, websiteDescription,websiteDescription1,websiteDescription2,websiteDescription3,listValue,listValue1; 
     ProgressDialog progress; 
     private Context context; 

     //check Internet connection. 
     private void checkInternetConnection(){ 

      ConnectivityManager check = (ConnectivityManager) this.context. 
        getSystemService(Context.CONNECTIVITY_SERVICE); 
      if (check != null) 
      { 
       NetworkInfo[] info = check.getAllNetworkInfo(); 
       if (info != null) 
        for (int i = 0; i <info.length; i++) 
         if (info[i].getState() == NetworkInfo.State.CONNECTED) 
         { 
          Toast.makeText(context, "Internet is connected", 
            Toast.LENGTH_SHORT).show(); 

         } 

      } 
      else{ 
       Toast.makeText(context, "not conencted to internet", 
         Toast.LENGTH_SHORT).show(); 
      } 
     } 

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

      //some code here 
     } 

     @Override 
     protected String[] doInBackground(Void... params) { 
      ArrayList<String> hrefs=new ArrayList<String>(); 
      try { 

       } 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      //get the array list values 
      for(String s:hrefs) 
      { 
       //some code 
      } 
      //parsing first URL 
      String [] resultArray=null; 
      try { 


      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      //parsing second URL 
      String [] resultArray1=null; 
      try { 



      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      try{ 


      } catch (Exception e) { 
       e.printStackTrace(); 
      } 


      return null; 
     } 



     @Override 
     protected void onPostExecute(String[] result) { 

      ListView list=(ListView)findViewById(R.id.listShow); 
      ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(getBaseContext(),android.R.layout.simple_list_item_1,result); 
      list.setAdapter(arrayAdapter); 
      mProgressDialog.dismiss(); 
     } 
    } 
} 

Jak mogę uruchomić kod, gdy połączenie jest otwarte i jak wyświetlić komunikat, gdy aplikacja ma dostęp do Internetu?

Odpowiedz

7

spróbować tej

//check internet connection 
public static boolean isNetworkStatusAvialable (Context context) { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (connectivityManager != null) 
    { 
     NetworkInfo netInfos = connectivityManager.getActiveNetworkInfo(); 
     if(netInfos != null) 
     { 
      return netInfos.isConnected(); 
     } 
    } 
    return false; 
} 

raz metody zwracają wartość trzeba sprawdzić

//detect internet and show the data 
    if(isNetworkStatusAvialable (getApplicationContext())) { 
     Toast.makeText(getApplicationContext(), "Internet detected", Toast.LENGTH_SHORT).show(); 
     new FetchWebsiteData().execute(); 
    } else { 
     Toast.makeText(getApplicationContext(), "Please check your Internet Connection", Toast.LENGTH_SHORT).show(); 

    } 
+0

świetna robota. Dziękuję – prathik

4
public static boolean hasInternetAccess(Context context) { 

    if (isNetworkAvailable(context)) { 
     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(); 
      return (urlc.getResponseCode() == 204 && 
         urlc.getContentLength() == 0); 
     } catch (IOException e) { 
      Log.e(TAG, "Error checking internet connection", e); 
     } 
    } else { 
     Log.d(TAG, "No network available!"); 
    } 
    return false; 
} 
2

Utwórz klasę NetworkInformation.java

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

public class NetworkInformation { 

    private static NetworkInfo networkInfo; 

    public static boolean isConnected(Context context) { 

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

      try{ 
       networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      // test for connection for WIFI 
      if (networkInfo != null 
        && networkInfo.isAvailable() 
        && networkInfo.isConnected()) { 
       return true; 
      } 

      networkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); 
      // test for connection for Mobile 
      if (networkInfo != null 
        && networkInfo.isAvailable() 
        && networkInfo.isConnected()) { 
       return true; 
      } 

      return false; 
     } 

} 

Sprawdź teraz, czy sieć jest dostępna, czy nie, przed wywołaniem takiemu asynktasowi:

if(NetworkInformation.isConnected(YourClassName.this)) 
     { 
      new FetchWebsiteData().execute();   
     }else{ 

      Toast.makeText(NewsAndEvents.this,R.string.no_connection,Toast.LENGTH_LONG).show(); 
     } 

Dont zapomnij podać poniższe uprawnienia w AndroidManifest.xml:

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

użyć tej metody do sprawdzania dostępności sieci

public static boolean isNetworkAvailable(Context context) { 



    try{ 
    ConnectivityManager connectivityManager 
      = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    boolean s= activeNetworkInfo != null && activeNetworkInfo.isConnectedOrConnecting(); 

     return s; 
    } 
    catch(Exception e){ 

     System.out.println("exception network"+e); 
     return false; 
    } 
} 

jeśli zwróci true można iść do przodu z sieci call else Toast komunikat o niedostępności sieci.

1

Użyj poniższego kodu i utwórz klasę, taką jak Dostępność sieci.java

public class NetworkAvailablity { 

    public static boolean checkNetworkStatus(Context context) { 
     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; 
    } 
} 

A w użytku kodu te następujące linie, które sprawdzić, że internet jest dostępny lub nie

 if (NetworkAvailablity.checkNetworkStatus(getActivity())) { 
      //code here 
     } 
     else 
     { 
     // give message here by Toast or create the alert dilog 
      Toast.makeText(context, "No network is available",Toast.LENGTH_LONG).show(); 
     } 
1
//Implement this code in MainActivity and check if isConnectingToInternet(), then allow Otherwise show the No Internet Connection message. 

public boolean isConnectingToInternet() { 
      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) { 
          return true; 
         } 

      } 
      return false; 
     } 
1

aby sprawdzić, czy użytkownik połączyć się z Wi-Fi lub punktu dostępowego lepiej jest najpierw sprawdzić tę metodę, aby sprawdzić, czy użytkownik ma jakieś połączenie, czy nie, , a jeśli zwróci true, możesz sprawdzić, czy ma on rzeczywiste połączenie, czy nie, z następną metodą

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

aby sprawdzić, czy użytkownik ma rzeczywisty ruch do wysłania żądania przez sieć

mieć świadomość, że nie należy wywołać metodę hasTraffic() w głównym wątku (można użyć AsyncTask)

public static boolean hasTraffic(){ 

    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(2000); // mTimeout is in seconds 
     urlc.connect(); 
     if (urlc.getResponseCode() == 200) { 
      Log.d("check Traffic ", "has traffic"); 
      return true; 
     } else { 
      return false; 
     } 
    } catch (Exception e) { 
     Log.i("warning", "Error checking internet connection", e); 
     return false; 
    } 

} 

Aby sprawdzić połączenia internetowego

 new AsyncTask<Void, Void, Boolean>() { 
     @Override 
     protected void onPostExecute(Boolean flag) { 

      if(flag == true){ 
       // do whatever you want 
      }else{ 
       cantAccessToService(); 
      } 
     } 

     @Override 
     protected Boolean doInBackground(Void... voids) { 
      if(isOnline(SplashActivity.this) && hasTraffic()){ 
       return true ; 
      }else{ 
       return false ; 
      } 
     } 
    }.execute(); 
Powiązane problemy