2013-07-31 10 views
9

私はwebviewを持つAndroidアプリを持っています。インターネットに接続されていない場合、webviewは利用できないページを表示します。私はできるだけアプリのように見えるようにしたいので、私はこのページを表示したくありません。私はいくつかの有益な情報をオンラインで見つけ出して、それを隠す方法や他のものを読み込む方法を教えてくれましたが、私が本当に望むのは現在のページにとどまり、小さなポップアップダイアログには接続がないということです。基本的に、ユーザーがWebビュー内の何かをクリックすると、最初に接続を確認します。接続がない場合は、その場所にとどまり、ダイアログボックスが表示されます。android - インターネットに接続していないときにwebviewが読み込まれないようにする方法

助けてくれてありがとう!

編集:私が言ったように

は、私はすでにオンラインサンプルからのインターネット接続を確認する方法を知っています。私の問題は、次のページの読み込みをやめる方法を知らないことです。ユーザーが次のページに移動しようとすると、インターネット接続を確認してください。接続されていない場合、ページは元の位置に留まり、次のページには移動しません。私は、ユーザーが最後に読み込まれたページを見て、ウェブページのコンテンツがまだそこにある間に情報を得ることができるようにしたい。ありがとう!

答えて

25

私は私のプロジェクトに次のように使用しています

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

メインコード:

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

がアップデートマニフェスト:

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

感謝を与える必要があり、次のコード

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

を次の中からそのイベントをキャプチャすることができます失われました!それは私の仕事です! あなたがAndroidManifestで '追加、network_accessための権限が必要:<使用許可アンドロイド名= "android.permission.ACCESS_NETWORK_STATEの"/>' – fermin

+0

感謝の男が魔法のように動作します:) – Skynet

+0

はまた、[ 'isConnectedOrConnectingがあります'](https://developer.android.com/reference/android/net/NetworkInfo.html#isConnectedOrConnecting())は、ネットワーク接続が確立されているかどうかを示します。 –

0

WebViewClientshouldOverrideUrlLoadingメソッドをオーバーライドして、URLのクリックをキャッチすることをお勧めします。無線LANの状態を確認するには

、あなたはこれを試してみてくださいConnectivityManager

を使用したいと思う:

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

} 

私は2つの小さなステップにあなたの問題を壊すお勧めします - 傍受と接続ステータスの確認]をクリックします、それらを検索します。これは、結果の多くをもたらした、と私は一緒にコードを配置するには、これらの2つの既存の答えを使用することができました:

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

あなたは私のCustomWebViewClientそれを使用することができます - ウェブページがロードさ ながらダイアログをロード

  • ショーを
  • ページの読み込みに失敗した場合のエラーメッセージの表示
  • インターネットなしの場合、モバイルデータの設定と有効化のオプションをユーザーに提供します。
  • 他のタイプのエラーの場合、ユーザーはウェブページをリロードすることができます。

あなたがする必要があるすべてはあなたのWebView

webView.setWebViewClient(新CustomWebViewClient())に添付しています。

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

接続方法を確認してください

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

あなたは、デバイスを確認することができますが行く、ユーザの後のコード

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 
} 

に従うことによって、データまたは無線LAN経由でインターネットに接続されwebviewに接続すると、あなたは権限が

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

関連する問題