puedo - Android: cómo evitar que se cargue webview cuando no hay conexión a Internet
pagina web no disponible android wifi (5)
He utilizado lo siguiente en mis proyectos:
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());
}
}
Código principal:
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;
}
}
Actualizar el Manifiesto:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
Tengo una aplicación para Android que tiene una vista web. Cuando no hay conexión a internet, webview mostrará la página no disponible. Quiero que esto parezca una aplicación lo más posible, así que no quiero mostrar esta página. Encontré información útil en línea que te enseña cómo ocultar o cargar otra cosa para cubrirla, pero lo que realmente quiero es quedarme en la página actual y un pequeño cuadro de diálogo emergente dice que no hay conexión. Básicamente, cuando el usuario hace clic en algo dentro de la vista web, primero verifique la conexión. Si no hay conexión, quédese donde estaba y abra un cuadro de diálogo.
¡¡Gracias por la ayuda!!
Editado:
Como dije, ya sé cómo comprobar la conexión a Internet de las muestras en línea. Mi problema es que no sé cómo dejar de cargar la página siguiente. Para que quede claro, cuando los usuarios intentan ir a la página siguiente, verifique la conexión a Internet. Si no hay conexión, la página se quedará donde estaba y no irá a la página siguiente. Quiero que los usuarios puedan ver su última página cargada e informarse mientras el contenido de la página web todavía está allí. ¡Gracias!
Puede verificar que el dispositivo esté conectado a Internet a través de datos o wifi siguiendo el código
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
}
Después de que el usuario vaya a la vista web, si se pierde la conexión, puede capturar ese evento desde el siguiente código
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();
}
}
siguientes permisos necesitan dar
<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" />
Puedes usar mi CustomWebViewClient
it -
- Muestra el diálogo de carga mientras se carga la página web.
- Mostrar mensajes de error en caso de que la carga de la página haya fallado.
- En el caso de No Internet, le da al usuario la opción de configurar y habilitar los datos móviles.
- En el caso de otro tipo de errores, permite al usuario volver a cargar la página web.
Todo lo que necesitas hacer es adjuntarlo a tu webView
webView.setWebViewClient (nuevo CustomWebViewClient ());
Clase 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;
}
}
}
}
Compruebe el método de conectividad
/**
* 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;
}
shouldOverrideUrlLoading anular el método shouldOverrideUrlLoading de un WebViewClient para capturar los clics de URL.
Para verificar el estado de Wifi, querrás usar el ConnectivityManager
Prueba esto:
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
}
}
}
Recomendaría dividir su problema en dos pasos más pequeños: haga clic en Intercepción y Verificación del estado de la conexión y búsquelos. Esto produce muchos resultados, y pude usar estas dos respuestas existentes para armar el código:
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;
}
});