it-swarm.com.de

android - So verhindern Sie, dass Webview geladen wird, wenn keine Internetverbindung besteht

Ich habe eine Android-App, die über einen Webview verfügt. Wenn keine Internetverbindung besteht, zeigt webview die Seite nicht an. Ich möchte, dass dies so aussieht wie eine App, so dass ich diese Seite nicht anzeigen möchte. Ich habe im Internet einige nützliche Informationen gefunden, die Ihnen beibringen, wie Sie etwas anderes verstecken oder laden, um sie zu verdecken. Ich möchte jedoch auf der aktuellen Seite bleiben. Wenn der Benutzer im Webview auf irgendetwas klickt, prüfen Sie zunächst, ob eine Verbindung besteht. Wenn keine Verbindung besteht, bleiben Sie an der Stelle, an der sie sich befunden hat, und rufen Sie ein Dialogfeld auf.

Danke für die Hilfe!!

bearbeitet:

Wie gesagt, ich weiß bereits, wie ich die Internetverbindung anhand der Beispiele online überprüfen kann. Mein Problem ist, dass ich nicht weiß, wie ich die nächste Seite laden kann. Um klar zu sein: Wenn Benutzer versuchen, zur nächsten Seite zu gelangen, überprüfen Sie die Internetverbindung. Wenn keine Verbindung besteht, bleibt die Seite dort, wo sie war, und würde nicht zur nächsten Seite gehen. Ich möchte, dass Benutzer ihre zuletzt geladene Seite sehen und sich informieren können, während der Inhalt der Seite noch vorhanden ist. Vielen Dank!

18
user1865027

Ich habe in meinen Projekten Folgendes verwendet:

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

Haupt code:

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

Aktualisieren Sie das Manifest:

<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
30
fida1989

Sie können meine CustomWebViewClient verwenden -

  • Zeigt den Ladedialog beim Laden der Webseite
  • Zeigt Fehlermeldungen an, falls das Laden der Seite fehlgeschlagen ist
  • Im Falle von No Internet gibt der Benutzer die Möglichkeit, mobile Daten festzulegen und zu aktivieren.
  • Bei anderen Arten von Fehlern kann der Benutzer die Webseite erneut laden.

Sie müssen es nur an Ihr WebView anhängen

webView.setWebViewClient (new CustomWebViewClient ());

CustomWebViewClient-Klasse

    /**
     * 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;
                }
            }
        }
    }

Überprüfen Sie die Verbindungsmethode

    /**
     * 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;

    }
5
Hitesh Sahu

Sie sollten die shouldOverrideUrlLoading -Methode eines WebViewClient überschreiben, um URL-Klicks abzufangen.

Um den WLAN-Status zu überprüfen, verwenden Sie den ConnectivityManager

Versuche dies:

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
        }
    }

}

Ich empfehle Ihnen, Ihr Problem in zwei kleinere Schritte zu unterteilen: Klicken Sie auf Abhören und Verbindungsstatus prüfen und suchen Sie danach. Dies führt zu zahlreichen Ergebnissen und ich konnte diese beiden vorhandenen Antworten verwenden, um den Code zusammenzustellen:

Intercept Webview Click

WLAN-Verbindung prüfen

0
Aaron

Sie können überprüfen, ob das Gerät über Daten oder WLAN mit dem Internet verbunden ist, indem Sie folgenden Code eingeben 

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
 }

Gehen Sie nach dem Benutzer zu webview. Wenn die Verbindung unterbrochen wird, können Sie dieses Ereignis aus folgendem Code erfassen

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


    }
}  

folgende Berechtigungen müssen gegeben werden

<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" />

0
ISURU
        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;
        }
    });
0
user2212515