studio simple permission example create android webchromeclient

android - simple - webChromeClient abre el enlace en el navegador



webview android studio (3)

He buscado y leído un montón de publicaciones, pero no puedo descubrir cómo hacerlo en mi código.

Quiero usar la geolocalización en mi aplicación y necesito ver en webChromeClient en lugar de webViewClient que uso para los archivos html ahora y los enlaces permanecen en la misma vista.

Cuando cambio esto a webChromeClient, los enlaces html, como <a href="http://url/file.php?q=123" , se abren de repente en el navegador.

¿Cómo puedo prevenir esto?

myWebView = new WebView(this); myWebView.getSettings().setJavaScriptEnabled(true); myWebView.getSettings().setLoadWithOverviewMode(true); myWebView.getSettings().setUseWideViewPort(true); myWebView.getSettings().setGeolocationEnabled(true); myWebView.setWebChromeClient(new WebChromeClient() { public void onGeolocationPermissionsShowPrompt(String origin, android.webkit.GeolocationPermissions.Callback callback) { callback.invoke(origin, true, false); } }); myWebView.loadUrl("file:///android_asset/HTML/index.html"); setContentView(myWebView);


Para abrir enlaces en el navegador, puede usar un intent en el método shouldOverrideUrlLoading para iniciar la URL en un navegador en lugar de usar su vista webview para manejar el enlace:

webView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url != null && url.startsWith("http://")) { view.getContext().startActivity( new Intent(Intent.ACTION_VIEW, Uri.parse(url))); return true; } else { return false; } } }

Si desea cargar en la vista web utilice:

WebViewClient yourWebClient = new WebViewClient() { // Override page so it''s load on my view only @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // This line we let me load only pages with an anchor tag if ( url.contains("url") == true ) //Load new URL Don''t override URL Link return false; // Return true to override url loading (In this case do nothing). return true; } };


Pude evitar esto al configurar un WebViewClient ficticio además del WebChromeClient. No estoy seguro de por qué, pero cuando saco esta línea, la página web comienza a abrirse nuevamente en el navegador.

mBrowser.setWebViewClient(new WebViewClient());


WebChromeClient no contiene el método shouldOverrideUrlLoading, el WebViewClient sí. Recuerde que "WebView" puede y usa WebViewClient y WebChromeClient al mismo tiempo, si se especifica. WebViewClient agrega métodos que no están disponibles para usted sin un cliente asignado (manteniendo la navegación en la vista web). Lo mismo con el WebChromeClient tiene métodos específicos que puede usar (por ejemplo, obtener el título de la página en carga).

Para que puedas construir tu código así:

WebView web = (WebView)findViewById(R.id.web); WebSettings webSettings = web.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setGeolocationEnabled(true); webSettings.setSupportMultipleWindows(true); // This forces ChromeClient enabled. web.setWebChromeClient(new WebChromeClient(){ @Override public void onReceivedTitle(WebView view, String title) { getWindow().setTitle(title); //Set Activity tile to page title. } }); web.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return false; } });