studio samsung programar para instalar descargar curso celular aplicacion java android

samsung - java para android apk



Evite que WebView muestre "página web no disponible" (16)

Tengo una aplicación que hace un uso extensivo de una WebView. Cuando el usuario de esta aplicación no tiene conexión a Internet, aparece una página que dice "página web no disponible" y varios otros textos. ¿Hay alguna manera de no mostrar este texto genérico en mi WebView? Me gustaría proporcionar mi propio manejo de errores.

private final Activity activity = this; private class MyWebViewClient extends WebViewClient public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // I need to do something like this: activity.webView.wipeOutThePage(); activity.myCustomErrorHandling(); Toast.makeText(activity, description, Toast.LENGTH_LONG).show(); } }

Descubrí WebView->clearView no borra la vista.


Aquí encontré la solución más fácil. mira esto..

@Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // view.loadUrl("about:blank"); mWebView.stopLoading(); if (!mUtils.isInterentConnection()) { Toast.makeText(ReportingActivity.this, "Please Check Internet Connection!", Toast.LENGTH_SHORT).show(); } super.onReceivedError(view, errorCode, description, failingUrl); }

Y aquí está el método isrentrentirection () ...

public boolean isInterentConnection() { ConnectivityManager manager = (ConnectivityManager) mContext .getSystemService(Context.CONNECTIVITY_SERVICE); if (manager != null) { NetworkInfo info[] = manager.getAllNetworkInfo(); if (info != null) { for (int i = 0; i < info.length; i++) { if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } } } return false; }


Consulte la discusión en Android WebView onReceivedError () . Es bastante largo, pero el consenso parece ser que a) no se puede detener la aparición de la página "página web no disponible", pero b) siempre se puede cargar una página vacía después de obtener un error recibido.


Cuando la vista web está incrustada en alguna vista personalizada, el usuario casi cree que está viendo una vista nativa y no una vista web. En tal escenario que muestra el error de "la página no se pudo cargar" es absurdo, lo que suelo hacer en tal situación es cargar una página en blanco y mostrar un mensaje de brindis como se muestra a continuación

webView.setWebViewClient(new WebViewClient() { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Log.e(TAG," Error occured while loading the web page at Url"+ failingUrl+"." +description); view.loadUrl("about:blank"); Toast.makeText(App.getContext(), "Error occured, please check newtwork connectivity", Toast.LENGTH_SHORT).show(); super.onReceivedError(view, errorCode, description, failingUrl); } });


Finalmente, resolví esto. (Funciona hasta ahora ...)

Mi solución es así ...

  1. Prepare el diseño para mostrar cuándo ocurrió un error en lugar de la página web (un mensaje sucio de "página no encontrada") El diseño tiene un botón, "RECARGAR" con algunos mensajes de guía.

  2. Si ocurre un error, recuerde usar boolean y muestre el diseño que preparamos.

  3. Si el usuario hace clic en el botón "RELOAD", configure mbErrorOccured en false. Y establece mbReloadPressed en verdadero.
  4. si mbErrorOccured es falso y mbReloadPressed es verdadero, significa webview cargó la página con éxito. Porque si se produce un error de nuevo, mbErrorOccured se establecerá como verdadero en onReceivedError (...)

Aquí está mi fuente completa. Mira esto.

public class MyWebViewActivity extends ActionBarActivity implements OnClickListener { private final String TAG = MyWebViewActivity.class.getSimpleName(); private WebView mWebView = null; private final String URL = "http://www.google.com"; private LinearLayout mlLayoutRequestError = null; private Handler mhErrorLayoutHide = null; private boolean mbErrorOccured = false; private boolean mbReloadPressed = false; @SuppressLint("SetJavaScriptEnabled") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_webview); ((Button) findViewById(R.id.btnRetry)).setOnClickListener(this); mlLayoutRequestError = (LinearLayout) findViewById(R.id.lLayoutRequestError); mhErrorLayoutHide = getErrorLayoutHideHandler(); mWebView = (WebView) findViewById(R.id.webviewMain); mWebView.setWebViewClient(new MyWebViewClient()); WebSettings settings = mWebView.getSettings(); settings.setJavaScriptEnabled(true); mWebView.setWebChromeClient(getChromeClient()); mWebView.loadUrl(URL); } @Override public boolean onSupportNavigateUp() { return super.onSupportNavigateUp(); } @Override public void onClick(View v) { int id = v.getId(); if (id == R.id.btnRetry) { if (!mbErrorOccured) { return; } mbReloadPressed = true; mWebView.reload(); mbErrorOccured = false; } } @Override public void onBackPressed() { if (mWebView.canGoBack()) { mWebView.goBack(); return; } else { finish(); } super.onBackPressed(); } class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return super.shouldOverrideUrlLoading(view, url); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); } @Override public void onLoadResource(WebView view, String url) { super.onLoadResource(view, url); } @Override public void onPageFinished(WebView view, String url) { if (mbErrorOccured == false && mbReloadPressed) { hideErrorLayout(); mbReloadPressed = false; } super.onPageFinished(view, url); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { mbErrorOccured = true; showErrorLayout(); super.onReceivedError(view, errorCode, description, failingUrl); } } private WebChromeClient getChromeClient() { final ProgressDialog progressDialog = new ProgressDialog(MyWebViewActivity.this); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.setCancelable(false); return new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); } }; } private void showErrorLayout() { mlLayoutRequestError.setVisibility(View.VISIBLE); } private void hideErrorLayout() { mhErrorLayoutHide.sendEmptyMessageDelayed(10000, 200); } private Handler getErrorLayoutHideHandler() { return new Handler() { @Override public void handleMessage(Message msg) { mlLayoutRequestError.setVisibility(View.GONE); super.handleMessage(msg); } }; } }

Además: aquí está el diseño ...

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rLayoutWithWebView" android:layout_width="match_parent" android:layout_height="match_parent" > <WebView android:id="@+id/webviewMain" android:layout_width="match_parent" android:layout_height="match_parent" /> <LinearLayout android:id="@+id/lLayoutRequestError" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:background="@color/white" android:gravity="center" android:orientation="vertical" android:visibility="gone" > <Button android:id="@+id/btnRetry" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:minWidth="120dp" android:text="RELOAD" android:textSize="20dp" android:textStyle="bold" /> </LinearLayout>


He estado trabajando en este problema de abandonar esas irritables páginas de error de Google hoy. Es posible con el código de ejemplo de Android visto arriba y en muchos otros foros (pregunte cómo lo sé):

wv.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { if (view.canGoBack()) { view.goBack(); } Toast.makeText(getBaseContext(), description, Toast.LENGTH_LONG).show(); } } });

SI lo pones shouldOverrideUrlLoading () como un cliente web más. Al menos, esto está funcionando para mí en mi dispositivo 2.3.6. Veremos dónde más funciona después. Eso solo me deprimiría ahora, estoy seguro. El bit de goBack es mío. Puede que no lo quieras.


He tenido que enfrentar este problema y también intenté resolverlo desde diferentes perspectivas. Finalmente encontré una solución usando un solo indicador para verificar si ocurría un error.

... extends WebViewClient { boolean error; @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { showLoading(true); super.onPageStarted(view, url, favicon); error = false; // IMPORTANT } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if(!error) { Observable.timer(100, TimeUnit.MICROSECONDS, AndroidSchedulers.mainThread()) .subscribe((data) -> view.setVisibility(View.VISIBLE) ); } showLoading(false); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { view.stopLoading(); view.setVisibility(View.INVISIBLE) error = true; // Handle the error } @Override @TargetApi(android.os.Build.VERSION_CODES.M) public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { this.onReceivedError(view, error.getErrorCode(), error.getDescription().toString(), request.getUrl().toString()); } }

De esta manera, oculto la página cada vez que hay un error y la muestro cuando la página se ha cargado correctamente.

También se agregó una pequeña demora en el caso.

Evité la solución de cargar una página vacía ya que no permite hacer webview.reload () más tarde porque agrega esa nueva página en el historial de navegación.


La mejor solución que he encontrado es cargar una página vacía en el evento OnReceivedError como este:

@Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); view.loadUrl("about:blank"); }


Podemos establecer la visibilidad de webView en 0 (ver.INVISIBLE) y mostrar algún mensaje. Este código funciona para mi aplicación que se ejecuta en lolipop.

@SuppressWarnings("deprecation") @Override public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) { // hide webView content and show custom msg webView.setVisibility(View.INVISIBLE); Toast.makeText(NrumWebViewActivity.this,getString(R.string.server_not_responding), Toast.LENGTH_SHORT).show(); } @TargetApi(android.os.Build.VERSION_CODES.M) @Override public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) { // Redirect to deprecated method, so you can use it in all SDK versions onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString()); }


Primero crea tu propia página de error en HTML y colócala en tu carpeta de activos, llamémosla myerrorpage.html. Luego con onReceivedError:

mWebView.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { mWebView.loadUrl("file:///android_asset/myerrorpage.html"); } });


Prueba esto

@SuppressWarnings("deprecation") @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // Your handling } @Override public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { onReceivedError(view, rerr.getErrorCode(), rerr.getDescription().toString(), req.getUrl().toString()); } }


Puede usar una solicitud GET para obtener el contenido de la página y luego visualizar esos datos usando Webview , de esta manera no está utilizando múltiples llamadas al servidor. Alternativa puede usar Javascript para verificar la validez del objeto DOM .


Simplemente cambiaría la página web a lo que sea que esté usando para el manejo de errores:

getWindow().requestFeature(Window.FEATURE_PROGRESS); webview.getSettings().setJavaScriptEnabled(true); final Activity activity = this; webview.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView view, int progress) { // Activities and WebViews measure progress with different scales. // The progress meter will automatically disappear when we reach 100% activity.setProgress(progress * 1000); } }); webview.setWebViewClient(new WebViewClient() { public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show(); } }); webview.loadUrl("http://slashdot.org/");

esto se puede encontrar en http://developer.android.com/reference/android/webkit/WebView.html


Supongo que si insistes en hacer esto, simplemente puedes verificar si el recurso está allí antes de llamar a la función loadURL. Simplemente anule las funciones y realice la comprobación antes de llamar al super ()

OBSERVACIÓN (tal vez fuera del tema): en http, hay un método llamado HEAD que se describe de la siguiente manera:

El método HEAD es idéntico a GET, excepto que el servidor NO DEBE devolver un mensaje-cuerpo en la respuesta

Este método puede ser útil. De todos modos, como sea que lo implemente ... revise este código:

import java.util.Map; import android.content.Context; import android.webkit.WebView; public class WebViewPreLoad extends WebView{ public WebViewPreLoad(Context context) { super(context); } public void loadUrl(String str){ if(//Check if exists) super.loadUrl(str); else //handle error } public void loadUrl(String url, Map<String,String> extraHeaders){ if(//Check if exists) super.loadUrl(url, extraHeaders); else //handle error } }

Podría intentar este control usando

if(url.openConnection().getContentLength() > 0)


Tal vez malinterpreto la pregunta, pero parece que estás diciendo que recibes la devolución de llamada por error, y solo preguntas cuál es la mejor manera de no mostrar el error. ¿Por qué no eliminas la vista web de la pantalla y / o muestras otra vista encima?


anula tu método WebViewClient

@Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { view.clearView(); }

view.loadUrl(''about:blank'') tiene efectos secundarios, ya que cancela la carga de la URL original.


intente esto shouldOverrideUrlLoading , antes de redirigir a otra url, compruebe si la conexión a Internet basada en esa página debe cargarse o no.