2013-07-31 10 views
9

Mam aplikację na Androida, która ma widok internetowy. Gdy nie ma połączenia z Internetem, wyświetlenie strony internetowej będzie niedostępne. Chcę, aby wyglądało to jak aplikacja tak bardzo, jak to możliwe, więc nie chcę wyświetlać tej strony. Znalazłem przydatne informacje w Internecie, uczące ukrywania lub ładowania czegoś innego, ale to, czego naprawdę chcę, to pozostać na bieżącej stronie i małe okienko dialogowe mówi, że nie ma połączenia. Zasadniczo, gdy użytkownik kliknie na coś wewnątrz widoku, najpierw sprawdź połączenie. jeśli nie ma połączenia, pozostań tam, gdzie był i wyskocz okno dialogowe.android - jak zapobiec ładowaniu się strony internetowej bez połączenia z Internetem

Dzięki za pomoc !!

Zmieniano:

Tak jak mówiłem, ja już wiem jak sprawdzić połączenia internetowego z próbek w Internecie. Mój problem polega na tym, że nie wiem, jak przerwać ładowanie następnej strony. Aby było jasne, kiedy użytkownicy próbują przejść do następnej strony, sprawdź połączenie internetowe. Jeśli nie ma połączenia, strona pozostanie tam, gdzie była i nie przejdzie na następną stronę. Chcę, aby użytkownicy mogli zobaczyć ostatnio załadowaną stronę i uzyskać informacje, gdy treść strony nadal tam jest. dzięki!

Odpowiedz

25

Użyłem następujących w moich projektach:

DetectConnection.Java

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); 

    return (con_manager.getActiveNetworkInfo() != null 
     && con_manager.getActiveNetworkInfo().isAvailable() 
     && con_manager.getActiveNetworkInfo().isConnected()); 
    } 
} 

Kod Główny:

if (!DetectConnection.checkInternetConnection(this)) { 
    Toast.makeText(getApplicationContext(), "No Internet!", Toast.LENGTH_SHORT).show(); 
} else {  
    wv = (WebView) findViewById(R.id.donate_webView1); 
    c = new CustomWebViewClient(); 
    wv.setWebViewClient(c); 
    wv.clearCache(true); 
    wv.clearHistory(); 
    wv.getSettings().setJavaScriptEnabled(true); 
    wv.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
    wv.getSettings().setBuiltInZoomControls(true); 
    wv.loadUrl("http://www.google.com"); 
} 


// Function to load all URLs in same webview 
private class CustomWebViewClient extends WebViewClient { 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    if (!DetectConnection.checkInternetConnection(this)) { 
     Toast.makeText(getApplicationContext(), "No Internet!", Toast.LENGTH_SHORT).show(); 
    } else { 
     view.loadUrl(url); 
    }  
    return true; 
    } 
} 

Aktualizacja Oczywisty:

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

dzięki !!! to działa dla mnie! trzeba uprawnienia network_access, dodać co AndroidManifest ' android.permission.ACCESS_NETWORK_STATE' – fermin

+0

Dzięki stary, działa jak marzenie :) – Skynet

+0

Ponadto, istnieje [ 'isConnectedOrConnecting '] (https://developer.android.com/reference/android/net/NetworkInfo.html#isConnectedOrConnecting()), który wskazuje, czy połączenie sieciowe istnieje lub jest w trakcie ustanawiania. –

0

Będziesz chciał zastąpić metodę shouldOverrideUrlLoading z WebViewClient, aby przechwytywać kliknięcia adresów URL.

Aby sprawdzić status Wifi, będziemy chcieli użyć ConnectivityManager

Spróbuj tego:

WebView mWebView; 
NetworkInfo networkInfoWifi = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE).getNetworkInfo(ConnectivityManager.TYPE_WIFI); 

mWebView.setWebViewClient(mWebClient); 

WebViewClient mWebClient = new WebViewClient(){ 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url){ 
     return true; 
    } 

    @Override 
    public void onLoadResource(WebView view, String url){ 
     if (networkInfoWifi.isConnected()) { 
      //Take action 
     } 
    } 

} 

Polecam łamiąc swój problem na dwa mniejsze etapy - Kliknij przechwycenie i status połączenia Sprawdzanie i szukając ich. Daje to mnóstwo wyników, a ja byłem w stanie korzystać z tych dwóch istniejących odpowiedzi ułożyła kod:

Intercept Webview Click

Check Wifi Connection

0
 webView.setWebViewClient(new WebViewClient() { 
     int errorCode = 0; 
     @SuppressWarnings("deprecation") 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      return handleUri(view, url); 
     } 

     @TargetApi(Build.VERSION_CODES.N) 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 
      return handleUri(view, request.getUrl().toString()); 
     } 

     private boolean handleUri(WebView view, final String url) { 
      view.loadUrl(url); 
      return true; 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      if(errorCode == 0) { 
       //CHECK IS PAGE I NEED AND DO STUFF 
      } else { 
       errorCode = 0; 
       //delay and try again 
      } 
     } 

     @SuppressWarnings("deprecation") 
     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      handleError(errorCode); 
     } 

     @TargetApi(Build.VERSION_CODES.N) 
     @Override 
     public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { 
      handleError(error.getErrorCode()); 
     } 

     private void handleError(int errorCode) { 
      this.errorCode = errorCode; 
     } 
    }); 
4

Możesz wykorzystać moje CustomWebViewClient It -

  • pokazy loading dialog natomiast strona internetowa obciążenia
  • Wyświetlenie komunikatów o błędach w przypadku niepowodzenia wczytywania strony
  • W przypadku braku połączenia z Internetem użytkownik może wybrać ustawienia i włączyć komórkową transmisję danych.
  • W przypadku innych rodzajów błędów, pozwala użytkownikowi ponownie załadować stronę.

Wszystko, co musisz zrobić, to podłączyć go do Webview

webView.setWebViewClient (nowa CustomWebViewClient());

klasa CustomWebViewClient

/** 
    * WebViewClient subclass loads all hyperlinks in the existing WebView 
    */ 
    public class CustomWebViewClient extends WebViewClient { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      // When user clicks a hyperlink, load in the existing WebView 
      view.loadUrl(url); 
      return true; 
     } 

     Dialog loadingDialog = new Dialog(WebViewActivity.this); 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
      webViewPreviousState = PAGE_STARTED; 

      if (loadingDialog == null || !loadingDialog.isShowing()) 
       loadingDialog = ProgressDialog.show(WebViewActivity.this, "", 
         "Loading Please Wait", true, true, 
         new DialogInterface.OnCancelListener() { 

          @Override 
          public void onCancel(DialogInterface dialog) { 
           // do something 
          } 
         }); 

      loadingDialog.setCancelable(false); 
     } 


     @RequiresApi(api = Build.VERSION_CODES.M) 
     @Override 
     public void onReceivedError(WebView view, WebResourceRequest request, 
            WebResourceError error) { 


      if (isConnected()) { 
       final Snackbar snackBar = Snackbar.make(rootView, "onReceivedError : " + error.getDescription(), Snackbar.LENGTH_INDEFINITE); 
       snackBar.setAction("Reload", new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         webView.loadUrl("javascript:window.location.reload(true)"); 
        } 
       }); 
       snackBar.show(); 
      } else { 
       final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE); 
       snackBar.setAction("Enable Data", new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0); 
         webView.loadUrl("javascript:window.location.reload(true)"); 
         snackBar.dismiss(); 
        } 
       }); 
       snackBar.show(); 
      } 

      super.onReceivedError(view, request, error); 

     } 

     @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
     @Override 
     public void onReceivedHttpError(WebView view, 
             WebResourceRequest request, WebResourceResponse errorResponse) { 

      if (isConnected()) { 
       final Snackbar snackBar = Snackbar.make(rootView, "HttpError : " + errorResponse.getReasonPhrase(), Snackbar.LENGTH_INDEFINITE); 

       snackBar.setAction("Reload", new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         webView.loadUrl("javascript:window.location.reload(true)"); 
        } 
       }); 
       snackBar.show(); 
      } else { 
       final Snackbar snackBar = Snackbar.make(rootView, "No Internet Connection ", Snackbar.LENGTH_INDEFINITE); 
       snackBar.setAction("Enable Data", new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         startActivityForResult(new Intent(Settings.ACTION_WIRELESS_SETTINGS), 0); 
         webView.loadUrl("javascript:window.location.reload(true)"); 
         snackBar.dismiss(); 
        } 
       }); 
       snackBar.show(); 
      } 
      super.onReceivedHttpError(view, request, errorResponse); 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 

      if (webViewPreviousState == PAGE_STARTED) { 

       if (null != loadingDialog) { 
        loadingDialog.dismiss(); 
        loadingDialog = null; 
       } 
      } 
     } 
    } 

Sprawdzić metodę Łączność

/** 
    * Check if there is any connectivity 
    * 
    * @return is Device Connected 
    */ 
    public boolean isConnected() { 

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

     if (null != cm) { 
      NetworkInfo info = cm.getActiveNetworkInfo(); 
      return (info != null && info.isConnected()); 
     } 

     return false; 

    } 
0

Można sprawdzić urządzenie ma łączyć się z Internetem za pośrednictwem danych lub wifi przez następujący kod

ConnectivityManager manager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo i = manager.getActiveNetworkInfo(); 
boolean hasConnect = (i!= null && i.isConnected() && i.isAvailable()); 

if(hasConnect) 
        { 
         // show the webview 
        } 
else 
{ 
    // do what ever you need when when no internet connection 
} 

Po użytkownik iść do podglądu strony internetowej, a następnie do połączenia zagubienia można uchwycić to wydarzenie z następującego kodu

webView.setWebViewClient(new Callback()); 

public class Callback extends WebViewClient{ 
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl){ 
     Toast.makeText(getApplicationContext(), "Failed loading app!, No Internet Connection found.", Toast.LENGTH_SHORT).show(); 


    } 
} 

następujące uprawnienia trzeba dać

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

Powiązane problemy